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

C++ function objects with explicit template parameters

本文关键字:C++ 函数 对象 参数      更新时间:2023-10-16

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

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

当我试着这样称呼它时:

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

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

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

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

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

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>()这样的语法是不可能的。

也许您可以将您的解决方案简化为:

template<class T>
struct foo
{
        T operator()() const
        {
            return 5;
        }
};
foo<int> bar = {};
int main()
{
    int i = bar();
    return 0;
}