2015-10-19 3 views
4

Я играл с переменным числом шаблонов, и это написал, основываясь на this answer:Явный оператор << выбирает «неправильно» перегружать

template <size_t... I> 
void print(seq<I...>) 
{ 
    decltype(std::cout) * dummy[sizeof...(I)] = { &(std::cout << I << ' ')... }; 
} 

Поскольку std::cout::operator<< имеет тип возвращаемого значения, она может быть сохранена, так что нет необходимости в (,0) запятой.

Теперь, чтобы закрыть вверх «„пустышки“не используется переменная» предупреждение, и напечатать строку, я попытался следующие высказывания, но они не делают то, что я хотел:

dummy[0]->operator <<('\n'); // prints 10 

(по-видимому, называется operator<<(int) вместо operator<<(char)

dummy[0]->operator <<("\n"); // prints a pointer 

(видимо, называется operator<<(const void*) вместо operator<<(const char*)

в конец, мне пришлось написать

*dummy[0] << '\n';    // prints a newline as desired 

Вопрос в том, почему выбрали «неправильные» перегрузки?

+2

Что делает 'std :: cout << std :: is_same :: значение << '\ n';' print? – Yakk

ответ

9

«Неправильные» перегрузки выбраны потому, что only some overloads являются членами класса std::ostream. Перегрузки для char и const char* не являются членами std::ostream, но free functions, так что, в

*dummy[0] << '\n'; 

аргумента в зависимости от поиска будет найти operator<<(std::ostream&, char), но в

dummy[0]->operator <<('\n'); 

только функции-члены будут рассмотрены, в результате чего в std::ostream::operator<<(int) называется.

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