我有以下代码...

#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运算符的特殊化。

#1楼 票数:1 已采纳

快速回答:

operator<< <eTag::A>(std::cout,42);

我认为,实现自己的模板类操纵器要好得多,该操纵器将ostream& operator<<(ostream&)用作朋友,并将状态保留为成员变量(通过构造函数初始化)。 参见此处 (模板部分除外)

#2楼 票数:1

operator<<<eTag::A>(std::cout, 42) << std::endl;

(如果需要,可以在operator<<和模板参数列表之间添加一个空格。没有区别。)

真讨厌 通常,我们不编写需要显式模板参数的运算符。 最好做这样的事情:

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;

一个好的编译器将能够内联该代码,因此您的代码将像您刚刚键入的代码一样高效。

std::cout << "A:" << 42 << std::endl;

  ask by user1715664 translate from so

未解决问题?本站智能推荐:

2回复

模板<<和>>运算符专业化

我想在一个类中对>>和<<运算符进行模板化,但是我也想将它们专门用于字符串,因此我做到了; 但是我遇到了一些编译器错误: 我该如何解决这些错误?
4回复

运算符的部分专业化()

我的一个类声明了一个模板化的函数: 我想部分专注于typename A B是一个实现非常小的接口的类型系列,我们使用了很多,所以我希望我的专业化在B上是通用的。 我怀疑这是双重烦恼,因为typename A仅用作返回类型。 从互联网上,我发现我不能部分专门化一个函数,所以我创建
1回复

专业化功能从其他功能调用

我试图弄清楚从另一个调用模板专门化功能。 在下面的简短片段中,我尝试从RED调用BLACK特定功能。 我收到以下编译器错误 无法在没有对象的情况下调用成员函数bool noClass<color>::_open() [with Colors color = (Colors)
3回复

模板类专业化函数调用。 C ++

考虑这段代码。 这个电话有办法吗? 还是一些解决方法?
1回复

模板模板参数和“<<”运算符(ostream)

几天来,我一直试图了解模板模板参数。 我尝试在 Visual Studio 中使用 C++17 编写示例,但出现此错误: 在这个例子中,我尝试使用来自 STL 的通用容器来突出 C++ 中模板模板参数的想法。 我究竟做错了什么?
2回复

模板专业类中的模板专业

以下在Visual Studio 2015中进行编译 但是GCC 5.2抱怨错误:主模板模板<>的声明中的template-id'foo <0>'静态void foo <0>(){} 如何修复代码,使其在两个编译器中都能编译?
1回复

模板专业化

我有以下模板集: 有人可以解释为什么funcT( x1 ); 调用函数#3和funcT( &x1 ); 调用功能#2但不按预期调用#4? 我已经阅读了这篇文章http://www.gotw.ca/publications/mill17.htm ,其中说“重载决策忽略了专业
2回复

模板方法的模板专业化

好吧,我有: 不幸的是,“做一些工作”的通用版本对我不起作用。 它也不容易修改,因为它位于一些繁重的模板元编程代码中。 因此,尽管我可以为我的类型专门化该方法。 因此,我的第一步是尝试从类中拉出通用方法。 不幸的是我遇到了错误: sh:13:错误:错误:预期在