【问题标题】:Is it possible to supply template parameters when calling operator()?调用operator()时是否可以提供模板参数?
【发布时间】:2014-10-14 02:17:42
【问题描述】:

我想使用模板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;
}

【问题讨论】:

  • 不使用速记语法,没有。
  • [edited] 你能告诉我们运营商如何使用T吗?
  • @MarkB 仅举一个例子:throw Treturn T(此处并非如此,但也不会被推断)。
  • 你想做什么?您似乎在尝试使用错误工具。
  • @Paul 你的意思是函数 implementation 取决于T 还是签名取决于?如果签名依赖,模板类型推导可能是可能的(但在某些情况下不是)。一个技巧(并非总是可能)是添加一个仅为类型推导的虚拟参数,例如operator()(T dummy),然后使用a(int()) 调用它。它将被优化掉,因此不涉及运行时开销成本,但它需要T 有一个没有副作用的默认构造函数。但我不确定这是否真的比a.operator()&lt;int&gt;()更具可读性。

标签: c++ templates operator-overloading


【解决方案1】:

就像 cmets 中提到的 chris 一样,不,不是使用速记语法。您必须使用完整的.operator()&lt;T&gt;() 语法;

【讨论】:

  • 我将其称为T-战斗机调用
  • @Xeo 最好的答案:-)
【解决方案2】:

如果你真的想使用模板化的operator() 并且想避免编写像a.operator()&lt;int&gt;(); 这样的结构,你可以给它添加一个辅助参数:

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&lt;int&gt;()); 中的空括号:

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.

【讨论】:

    【解决方案3】:

    您想使用的确切语法在 C++ 语言中是不可能的。

    根据您要解决的真实问题(不在问题中),我可以想到至少三个选项:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      相关资源
      最近更新 更多