【问题标题】:Function template with an operator带运算符的函数模板
【发布时间】:2010-11-10 03:22:23
【问题描述】:

在 C++ 中,您可以在类上使用模板化运算符吗?像这样:

class MyClass {
public:
    template<class T>
    T operator()() { /* return some T */ };
}

这实际上似乎编译得很好,但令人困惑的是如何使用它:

MyClass c;
int i = c<int>(); // This doesn't work
int i = (int)c(); // Neither does this*

它完全编译的事实向我表明它是可行的,我只是不知道如何使用它!有什么建议吗,或者这种使用方法不适合?

【问题讨论】:

  • “这不起作用/这也不行”是什么意思?会发生什么?
  • 编译器对你有问题,这就是发生的事情:)
  • 我发誓我以前在 SO 上看到过这个问题...虽然我找不到它,所以显然不能怪你。
  • 谢谢。我猜我在尝试搜索时只是输入了错误的关键字。 (没想到要尝试函子。回想起来应该很明显)

标签: c++ templates operator-overloading


【解决方案1】:

您需要指定T

int i = c.operator()<int>();

很遗憾,在这种情况下你不能直接使用函数调用语法。

编辑:哦,你在类定义的开头缺少public:

【讨论】:

  • 不错。感谢快速准确的答案!不幸的是,这可能对我的用途来说是冗长的(因为我的代码打算被其他人调用,我想避免混淆)所以我只需要找到另一条路线。再次感谢!
  • 是的,你最好定义一个get 方法而不是operator()。然后你可以写c.get&lt;int&gt;()
  • 其实有一个成语飞来飞去,被很多人使用:free get function(元组使用get&lt;N&gt;(some_tuple),boost.variant使用get&lt;T&gt;(some_variant))。所以你的看起来像get&lt;T&gt;(c)getMyClass'es 命名空间中定义)。
  • 在这种情况下,我需要一个返回值的调用和一个没有返回值的调用。我为返回版本实现了 Evaluate(),为非返回版本实现了 Execute(),然后允许用户调用 () 运算符作为评估的替代方案。 (这些名称在上下文中是有意义的,因为它们正在执行脚本中定义的函数。)所以本质上,是的,我实现了一个 get 函数 :) 感谢所有建议!
【解决方案2】:

你基本上是对的。定义模板化操作符是合法的,但不能直接使用显式模板参数调用。

如果你有这个运算符:

template <typename T>
T operator()();

在你的例子中,它只能这样调用:

int i = c.operator()<int>();

当然,如果模板参数可以从参数中推导出来,你仍然可以正常调用它:

template <typename T>
T operator()(T value);

c(42); // would call operator()<int>

另一种方法是使参数成为引用,并将输出存储在那里,而不是返回它:

template <typename T>
void operator()(T& value);

所以不要这样:

int r = c.operator()<int>();

你可以的

int r;
c(r);

或者您应该只定义一个简单的get&lt;T&gt;() 函数而不是使用运算符。

【讨论】:

    【解决方案3】:

    你有没有想过

    class Foo {
        public:
        template<typename T>
        operator T() const { return T(42); }
    };
    
    Foo foo;
    
    int i = (int) foo; // less evil: static_cast<int>(foo);
    

    live example。这证明您不需要指定模板参数,尽管在接受的答案中声明。

    【讨论】:

    • 在这种情况下有效,但我在想c&lt;int&gt;++。我的意思是这不应该工作,我有点滥用符号那里......
    • @kim366:既然这没有意义,那么考虑它是毫无意义的。它不应该起作用,而且它不起作用。
    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 2015-05-08
    • 2020-10-15
    • 2014-10-07
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多