5

我有一个带有显式(即非推导)模板参数的函数对象,定义如下:

struct foo
{
    template<class T>
    T operator()() const
    {
        return 5;
    }
};

foo bar = {};

当我尝试这样称呼它时:

int main()
{
    int i = bar<int>();
    return 0;
}

我得到一个编译错误。有没有办法像普通函数一样用模板参数调用函数对象?我真的需要把它作为一个函数对象。制作免费功能对我来说并不是一个真正的选择(或者至少,这是一个非常混乱的选择)。

4

3 回答 3

9

不幸的是,你不能这样称呼它。您需要使用以下operator()语法:

int i = bar.operator()<int>();
于 2013-02-21T22:27:06.987 回答
2

您可以像这样使用转换运算符的技巧:

struct foo
{
  struct inner {
    template <typename T> operator T() const { return 5; }
  };
  inner operator()() const { return inner(); }
};

foo bar = {};
int main()
{
  int i = bar(); // implicit
  auto x = static_cast<int>(bar()); // "explicit" template parameter
}

我认为完全一样的语法bar<int>()是不可能的。

于 2013-02-21T22:30:11.003 回答
0

也许您可以像这样简化您的解决方案:

template<class T>
struct foo
{
        T operator()() const
        {
            return 5;
        }
};

foo<int> bar = {};

int main()
{
    int i = bar();
    return 0;
}
于 2013-02-22T11:59:47.013 回答