2013-04-22 2 views
1

Я хочу создать функцию, которая принимает все, что может обработать оператор << для std::cout. У меня есть пример, который ломается.Шаблоны для ввода cout

#include <iostream> 

template <typename T> 
void my_print(const T &t) { 
    std::cout << t; 
} 

int main() { 
    my_print("hello\n"); // works 
    my_print(4); // works 
    my_print(std::endl); // compiler error 
    return 0; 
} 

Он также терпит неудачу, если я изменяю void my_print(T t). Ошибка компилятора

error: no matching function for call to 'my_print(<unresolved overloaded function type>)' 
note: candidate is 
note: template<class T> void my_print(const T&)

Почему не компилятор решительность его, когда он видит, что аргумент t кладется в cout?

Есть ли хороший способ исправить это или я должен вручную предоставить дополнительные << чехлы, например. void my_print(ostream& (*pf)(ostream&));

EDIT: Я знаю endl является функцией. Является ли ответ тем, что типы функций не принимаются в качестве шаблонов? Как у меня не может быть [T = ostream& (*)(ostream&)]?

+0

возможно дубликат [станд :: End L, имеет неизвестную типа, когда оператор перегрузки <<] (http://stackoverflow.com/questions/1134388/stdendl-is-of-unknown-type-when-overloading-operator) – Rubens

+1

Это потому, что endl * не является * функцией ... –

+0

@ KerrekSB А? 'ostream & operator << (ostream & (* pf) (ostream &))' - это то, что вызывается 'cout << endl'. Это, по-видимому, указывает на то, что 'endl' - это функция, принимающая и возвращающая' ostream & '. – Nick

ответ

0

std::endl - это фактически шаблон функции. Вы можете прочитать полную документацию here или here. Она определяется как:

template< class CharT, class Traits > 
std::basic_ostream<charT,traits>& endl(std::basic_ostream<CharT, Traits>& os); 

Edit: Вы можете добиться того, что вы хотите с помощью этого решения (которое я смутно адаптированный here)

#include <iostream> 

// handles the other types 
template <typename T> 
void my_print(const T &t) { 
    std::cout << t; 
} 

// alias a few things to make the prototypes readable 
typedef std::basic_ostream<char, std::char_traits<char> > CoutType; 
typedef CoutType& (*StandardEndLine)(CoutType&); 

int main() { 
    my_print("hello\n"); // works 
    my_print(4); // works 
    my_print((StandardEndLine)std::endl); // <- NOTE: there is an explicit cast 
    return 0; 
} 
+1

Это не функция, это шаблон. –

+0

это шаблонная функция ... – Thibaut

+0

С технической точки зрения это называется манипулятором IO. Но это «что-то принимает аргумент и возвращает значение ...», называя его функцией не за горами ... – Thibaut

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