参数化自定义流操纵器 - 为什么要重载 "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);
标准委员会不想处理的乱七八糟的细节就像打开了整个潘多拉魔盒。
我正在尝试为特定数据集实现参数化流操纵器。我按照推荐的简单方法进行操作:
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);
标准委员会不想处理的乱七八糟的细节就像打开了整个潘多拉魔盒。