我有一个带有显式(即非推断)模板参数的函数对象,如下所示:
struct foo
{
template<class T>
T operator()() const
{
return 5;
}
};
foo bar = {};
当我尝试这样称呼它时:
int main()
{
int i = bar<int>();
return 0;
}
我收到编译错误。有没有办法像常规函数一样用模板参数调用函数对象?我真的需要将它作为一个函数对象。制作一个免费功能对我来说并不是一个真正的选择(或者至少,它是一个非常混乱的选项)。
答案 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;
}