0

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

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

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

4

2 回答 2

4

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

关于您的示例,您可以为默认可构造的仿函数添加默认构造函数,例如std::lesset al。

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

于 2013-08-15T08:12:29.477 回答
2

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

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

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

auto f = make_foo(std::less<int>());
于 2013-08-15T08:14:33.127 回答