适用于全局模板运算符指定模板参数的适当语法

Proper syntax for specifying template parameters for a global templated operator?

本文关键字:参数 语法 全局 运算符 适用于      更新时间:2023-10-16

对不起,这是一个琐碎的问题,但是我无法尝试使用几次尝试,而是决定在这里询问。在这种情况下,指定模板参数的正确方法是什么:

#include <sstream>
struct bar
{
    int foo = 5;
};
template<size_t i>
std::ostream& operator<<(std::ostream& s, bar b)
{
    s << b.foo + i;
    return s;
}
int main(int argc, char** argv)
{
    std::stringstream s;
    bar b;
    // Proper way of writing s << bar ?
    return 0;
}

您被迫使用长表格来调用操作员,并明确传递模板参数

int main()
{
    std::stringstream s;
    bar b;
    ::operator<<<1>(s, b);
    return 0;
}

demo

::operator<<<1>(s, b);语法看起来很奇怪,但专注于::operator<<部分,该部分是在全局名称空间中引用操作员。由于您已将其写入模板,并且无法从参数中推断出模板参数(size_t),因此您被迫以<1><2><3>等)形式使用显式模板参数

由于您的函数模板没有可推论的参数,因此您必须用模板参数明确调用它。它的丑陋。

operator << <4>(s, b);

另一个丑陋的黑客是使用代理 template-class

template<std::size_t K>
struct bT{
    bT(bar& bb) : b(bb) {} bar& b;
    static constexpr std::size_t i = K;
};

然后将模板operator <<修改为:

template<size_t i>
std::ostream& operator<<(std::ostream& s, bT<i> b)
{
    s << b.b.foo + b.i;
    return s;
}

并打电话:

s << bT<4>(b);

演示..无论如何,我们的面板都击败了这个,最终仍然很丑陋。节省所有人的压力,并使用命名功能。这将更加直观。