调用专门的 ostream 运算符
Invoking specialized ostream operator
我有以下代码...
#include <sstream>
enum class eTag
{
A,
B,
C
};
template<eTag I> std::ostream& operator<< (std::ostream& str, int i)
{
return str; // do nothing
}
template<> std::ostream& operator<< <eTag::A>(std::ostream& str, int i)
{
return str << "A:" << i; // specialize for eTag::A
}
template<> std::ostream& operator<< <eTag::B>(std::ostream& str, int i)
{
return str << "B:" << i; // specialize for eTag::B
}
template<> std::ostream& operator<< <eTag::C>(std::ostream& str, int i)
{
return str << "C:" << i; // specialize for eTag::C
}
int main()
{
std::ostringstream s;
// s << <eTag::A>(42) << std::endl;
return 0;
}
编译通过。但是正如您从 main() 中的注释行中看到的那样,我正在为如何实际调用 ostream 运算符的特化而苦苦挣扎。
快速回答:
operator<< <eTag::A>(std::cout,42);
我认为你最好实现你自己的模板-class 操纵器 ostream& operator<<(ostream&)
,并将状态保持为成员变量(通过构造函数初始化)。参见 (模板部分除外)
operator<<<eTag::A>(std::cout, 42) << std::endl;
(如果需要,您可以在 operator<<
和模板参数列表之间添加 space。没有区别。)
这很讨厌。通常我们不会编写需要显式模板参数的运算符。最好这样做:
inline std::ostream& operator<<(std::ostream& os, eTag x) {
if (x == eTag::A) {
return os << "A:";
} else if (x == eTag::B) {
return os << "B:";
} else if (x == eTag::C) {
return os << "C:";
} else {
throw std::range_error("Out of range value for eTag");
}
}
然后:
std::cout << eTag::A << 42 << std::endl;
A good compiler will be able to inline this,因此您的代码将像您刚刚输入的一样高效
std::cout << "A:" << 42 << std::endl;
我有以下代码...
#include <sstream>
enum class eTag
{
A,
B,
C
};
template<eTag I> std::ostream& operator<< (std::ostream& str, int i)
{
return str; // do nothing
}
template<> std::ostream& operator<< <eTag::A>(std::ostream& str, int i)
{
return str << "A:" << i; // specialize for eTag::A
}
template<> std::ostream& operator<< <eTag::B>(std::ostream& str, int i)
{
return str << "B:" << i; // specialize for eTag::B
}
template<> std::ostream& operator<< <eTag::C>(std::ostream& str, int i)
{
return str << "C:" << i; // specialize for eTag::C
}
int main()
{
std::ostringstream s;
// s << <eTag::A>(42) << std::endl;
return 0;
}
编译通过。但是正如您从 main() 中的注释行中看到的那样,我正在为如何实际调用 ostream 运算符的特化而苦苦挣扎。
快速回答:
operator<< <eTag::A>(std::cout,42);
我认为你最好实现你自己的模板-class 操纵器 ostream& operator<<(ostream&)
,并将状态保持为成员变量(通过构造函数初始化)。参见
operator<<<eTag::A>(std::cout, 42) << std::endl;
(如果需要,您可以在 operator<<
和模板参数列表之间添加 space。没有区别。)
这很讨厌。通常我们不会编写需要显式模板参数的运算符。最好这样做:
inline std::ostream& operator<<(std::ostream& os, eTag x) {
if (x == eTag::A) {
return os << "A:";
} else if (x == eTag::B) {
return os << "B:";
} else if (x == eTag::C) {
return os << "C:";
} else {
throw std::range_error("Out of range value for eTag");
}
}
然后:
std::cout << eTag::A << 42 << std::endl;
A good compiler will be able to inline this,因此您的代码将像您刚刚输入的一样高效
std::cout << "A:" << 42 << std::endl;