将函子传递给构造函数

Pass functor to constructor

本文关键字:构造函数      更新时间:2023-10-16

我有一个类,它基本上需要存储构造函数中给定的函子,类似于以下内容:

template <class T>
class Foo {
   private:
     T func;
   public:
     Foo(T f) : func(f) { }
}

然而,要创建Foo类的新实例,我似乎不能这样做:

Foo foo(std::less<int>());

因为T是类模板参数。我不得不使用这种笨拙的语法:

Foo<std::less<int>> foo(std::less<int>());

有没有更好的方法可以做到这一点,而不需要写两次函子的类型?

Foo不是一个类,它是一个类模板。为了创建类型,您必须使用模板参数实例化它。

关于您的示例,您可以为默认可构造的函子添加一个默认构造函数,如std::less等人的

template <class T>
class Foo {
   private:
     T func;
   public:
     Foo() = default; // C++03 would require Foo() {}
     Foo(T f) : func(f) { }
};

然后

Foo<std::less<int>> foo;

或者,您可以提供一个函数模板,该模板接受一个函子并返回一个Foo<F>对象。

您可以使用函数来推导函子类型并返回正确的Foo风格:

template <typename T>
Foo<T> make_foo(T t) { return Foo<T>(t); }

但这个解决方案基本上需要C++11中的CCD_ 5来存储返回值:

auto f = make_foo(std::less<int>());