将仿函数传递给构造函数

时间:2013-08-15 08:10:47

标签: c++ functor

我有一个基本上需要存储构造函数中给出的仿函数的类,类似于:

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>());

有没有更好的方法来做到这一点,而不是两次编写仿函数的类型?

2 个答案:

答案 0 :(得分:4)

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>对象。

答案 1 :(得分:2)

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

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

但是这个解决方案基本上需要来自C ++ 11的auto来存储返回值:

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