我有一个基本上需要存储构造函数中给出的仿函数的类,类似于:
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>());
有没有更好的方法来做到这一点,而不是两次编写仿函数的类型?
答案 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>());