1

我想创建一个函数,该函数接受<<操作员std::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). 编译器错误是

错误:没有匹配的函数调用'my_print(<未解析的重载函数类型>)'
注:候选人是
注意:模板<class T> void my_print(const T&)

为什么编译器看到参数t被放入时不能解析它cout

有什么好的方法可以解决这个问题还是我必须手动提供额外的<<案例,例如void my_print(ostream& (*pf)(ostream&));

编辑:我知道endl是一个函数。那么答案是函数类型不被接受为模板吗?好像我不能拥有[T = ostream& (*)(ostream&)]

4

1 回答 1

0

std::endl实际上是一个函数模板。您可以在此处此处阅读完整的文档。它被定义为:

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

编辑:你可以使用这个解决方案来实现你想要的(我从这里模糊地改编了)

#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;
}
于 2013-04-22T23:52:50.557 回答