可以使用 lambda 的类型作为模板参数,例如
template<typename InArg, typename Function>
class selfCompose {
Function f;
public:
selfCompose(Function f): f(f) {}
auto operator() (InArg x) -> decltype(f(f(x))) {
return f(f(x)); }
};
int main() {
auto f = [](int x){return x*x;};
std::cout << selfCompose<int, decltype(f)>(f)(4) // yields (4²)² = 256
<< std::endl;
return 0;
}
但是,这种双重使用f
有点多余。我们可以省略将 lambda 的类型作为模板传递(将其转换为合适的类型std::function
(失去多态性 - 但 C++ lambda 无论如何都不是参数多态的)),但是我有一个应用程序,我更希望不必传递它的构造函数的值(因为我想将我的类的初始化本身用作模板参数,其中需要特定的构造函数签名)。我希望它像
template<class InArg, class Function>
class selfCompose {
Function f;
public:
selfCompose() {} // default constructor for f
auto operator() (InArg x) -> decltype(f(f(x))) {
return f(f(x)); }
};
int main() {
auto f = [](int x){return x*x;};
std::cout << selfCompose<int, decltype(f)>()(4) << std::endl;
return 0;
}
但这不会编译,因为 lambdas 有一个已删除的默认构造函数。这对于捕获lambdas 来说当然是不可避免的,但是对于像我的示例中的简单的那些,这对我来说没有多大意义:它们不需要引用任何局部变量。
是否有其他方法可以获得此功能,或者我是否必须求助于将 lambda old-fashonly 定义为命名类?
struct myFun {
auto operator() (int x) -> int {return x*x;}
};
(当然,我想使用的 lambda 函数并不像那样简单x → x²
,因此仅从几个标准函数类中选择不够灵活)