2016-11-01 2 views
-2

Edit: Определение class TF:Возможно ли иметь разные операторы <<() перегрузки для записи в файл и std :: cout?

class TF { 
    std::vector<V4f> waypoints; 
    std::vector<int> densityWaypoints; 
public: 
    std::size_t size() const { return waypoints.size(); } 
    friend std::ostream& operator<<(std::ostream& str, const TF& tf); 
    friend std::fstream& operator<<(std::fstream& str, const TF& tf); 
    // methods here 
}; 

Вопрос может парить от того, что я не понимаю, потоки, так что, вероятно, является предварительным условием.

Возможно ли перегрузить operator<<(std::ostream, T) так, что при вызове для отображения структуры данных на экране используется одна перегрузка, а когда структура данных записывается в файл, используется другая? Нечто подобное, вероятно:

std::ostream& operator<<(std::ostream& str, const TF& tf) { 
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) { 
     str << " { " 
      << tf.densityWaypoints[i] << " : " 
      << tf.waypoints[i][3] << " : " 
      << tf.waypoints[i][0] << " , " 
      << tf.waypoints[i][1] << " , " 
      << tf.waypoints[i][2] 
      << " } "; 
    } 
    str << "\n"; 
    return str; 
} 

std::fstream& operator<<(std::fstream& str, const TF& tf) { 
    str << (int)tf.size(); 
    for (std::size_t i = 0; i != tf.waypoints.size(); ++i) { 
     str << tf.densityWaypoints[i] 
      << tf.waypoints[i][0] 
      << tf.waypoints[i][1] 
      << tf.waypoints[i][2] 
      << tf.waypoints[i][3]; 
    } 

Это не компилируется со странной ошибкой (Может быть, я устал):

error: no match for ‘operator<<’ (operand types are ‘std::fstream {aka std::basic_fstream}’ and ‘int’)

Ошибка возникает при добавлении второй operator<<() перегрузки. Первый работает отлично. Пробовал и std::ofstream, и std::fstream к тому же результату.

Но я не уверен, что это сработает. Конечно, можно определить такую ​​функцию, как int writeTF(std:fstream& str, const TF&tf), но это не похоже на C++ для меня, не говоря уже о странной ошибке, которая также может появиться здесь.

+1

Это, конечно, возможно. –

+1

Не могли бы вы привести пример, где произошла ошибка. Прямо сейчас код, который вы нам представляете, не компилируется по разным причинам. – 0x499602D2

+0

@ 0x499602D2 разместил ярлык определения класса – iksemyonov

ответ

1

Я видел код, сравнивающий адрес ostream с адресом cout. У меня смешанные чувства по этому поводу, но это, конечно, работал:

std::ostream& operator<<(std::ostream& o, Foo const&) 
{ 
    if(&o == &std::cout) { 
     return o << "cout"; 
    } else { 
     return o << "not_cout"; 
    } 
} 

demo

Обратите внимание, что cout выводит на стандартный вывод, что это не то же самое, как «экран».

+0

«Экран» - это человеческое определение, конечно. – iksemyonov

+2

@iksemyonov заключается в том, что вывод может быть перенаправлен с экрана на файл с большинством ОС. –

Смежные вопросы