参数化自定义流操纵器 - 为什么要过载"operator<<"?



我正在尝试为一组数据实现参数化流操纵器。我用推荐的简单方法:

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);

会打开一个潘多拉的盒子,里面有标准委员会不想处理的乱七八糟的细节。

相关内容

最新更新