我正在尝试为一组数据实现参数化流操纵器。我用推荐的简单方法:
class print_my_data
{
private:
. . .
public:
print_my_data(. . .) { . . . }
ostream& operator()(std::ostream& out)
{
return out << . . . << endl;
}
};
ostream& operator<<(ostream& out, print_my_data md) // <=== MY QUESTION BELOW IS ABOUT THIS
{
return md(out);
}
用法:
clog << print_my_data(. . .) << endl;
这个工作很好;但我真的不明白为什么它不工作,除非我定义operator<<
!为什么它不调用与endl
相同的重载函数??(即作为可以通过operator()
应用于流的对象)
您正在寻找的重载仅为函数指针定义。
basic_ostream& operator<<( std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );
您的print_my_data
类是一个可调用的对象(c++术语中的函子)。但它不是一个函数指针。另一方面,endl
是一个函数,因此有一个函数指针(实际上,它是c++标准库中为数不多的有地址的函数之一)
可以提出一个不无道理的论点,即重载应该看起来像
basic_ostream& operator<<( std::function<std::basic_ostream<CharT,Traits>&(std::basic_ostream<CharT,Traits>&)> func);
但是,可惜的是,在编写I/O操作符的时候,std::function
还没有出现。就这一点而言,它们都不是概念。使用SFINAE来声明
template <typename F> basic_ostream& operator<<( F func);
会打开一个潘多拉的盒子,里面有标准委员会不想处理的乱七八糟的细节。