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

Parametrized custom stream manipulators - why overload "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() 应用于流的对象)

您要查找的 overload 仅为函数指针定义。

basic_ostream& operator<<(
   std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );

您的 print_my_data class 是一个可调用对象(仿函数,用 C++ 术语来说)。但它不是函数指针。另一方面,endl 是一个函数,因此有一个函数指针(事实上,它是 C++ 标准库中少数几个 do 有地址的函数之一)

可以提出一个不合理的论点,即重载应该看起来像

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

标准委员会不想处理的乱七八糟的细节就像打开了整个潘多拉魔盒。