我可以将非类型模板参数传递给重载运算符吗

Can I pass a non-type template argument to an overloaded operator?

本文关键字:重载 运算符 参数传递 类型 我可以      更新时间:2023-10-16

我想通过重载()作为getter方法来为类添加一些语法糖。但是,getter方法采用非类型模板参数。考虑一个简单的测试用例:

#include <iostream>
class Foo
{
public:
  template <int i> void get()
  {
    std::cout << "called get() with " << i << std::endl;
  }
  template <int i> void operator()()
  {
    std::cout << "called overloaded () with " << i << std::endl;
  }
};
int main()
{
  Foo foo;
  foo.get<1>();
  foo.get<2>();
  foo<3>(); // error: no match for ‘operator<’ in ‘foo < 3’
  return 0;
}

如果foo<3>();被注释掉,这将按预期编译和运行。C++语法支持我尝试做的事情吗?还是应该放弃并坚持使用getter的命名方法?

您正在寻找的语法存在,但您不会喜欢它:

foo.operator()<3>();

所以,坚持使用命名函数。

您可以将模板放在类上进行管理,如下所示:

template<int i>
class Foo
{
    Foo()
    {
        std::cout << "called overloaded () with " << i << std::endl;
    }
    static void Get()
    {
        std::cout << "called get() with " << i << std::endl;
    }
};
int main()
{
    Foo<1>::Get();
    Foo<3>();
    return 0;
}

然而,在调用direct()表单时,会构造一个Foo对象,因此会有一点损失

此外,我想你的真实代码在Foo类中还有很多其他东西,所以仅仅为了管理这一点而将模板移动到类中(这可能是一个重大的设计更改)可能是不可接受的。

编辑:

事实上,由于OP可能已经在使用Foo的一个实例,所以我的整个提议都是愚蠢的。不要麻烦。