具有显式模板参数的C ++函数对象

时间:2013-02-21 22:25:31

标签: c++ boost c++11

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

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

foo bar = {};

当我尝试这样称呼它时:

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

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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>()完全相同是不可能的。

答案 2 :(得分:0)

也许你可以简化你的解决方案:

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

foo<int> bar = {};

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