调用operator()时是否可以提供模板参数?

时间:2014-08-20 16:08:59

标签: c++ templates operator-overloading

我想使用模板operator(),但我不确定它是否可行。这是一个不会编译的简单测试用例。我的语法有问题,或者这根本不可能?

struct A {
  template<typename T> void f() { }
  template<typename T> void operator()() { }
};

int main() {
  A a;
  a.f<int>();           // This compiles.
  a.operator()<int>();  // This compiles.
  a<int>();             // This won't compile.
  return 0;
}

3 个答案:

答案 0 :(得分:6)

像评论中提到的克里斯,不,不是用简写语法。您必须使用完整的.operator()<T>()语法;

答案 1 :(得分:4)

如果确实想要使用模板化operator()并希望避免编写a.operator()<int>();之类的结构,则可以向其添加辅助参数:

template <typename T>
struct type{};

struct A
{
    template<typename T>
    void operator()(type<T>) { }
};

int main()
{
    A a;

    a(type<int>());
}

Live demo


在C ++ 14中,您甚至可以通过变量模板省略a(type<int>());中的空括号:

template <typename T>
struct type_{};

template <typename T>
constexpr type_<T> type{};

struct A
{
    template<typename T>
    void operator()(type_<T>) { }
};

int main()
{
    A a;

    a(type<int>);
}

Live demo

答案 2 :(得分:2)

在C ++语言中无法使用您想要使用的确切语法。

根据您尝试解决的真实问题(问题中没有),我至少可以考虑三个选项:

  • 使用命名函数代替运算符。
  • 模板A而非操作员本身。
  • 使用详细拼写来调用operator()(我不是此选项的忠实粉丝)。