[英]How do I initialize an object using a static member function of that object's class?
我有一个 class 和一些 static 功能。 class 构造函数将 function 作为其 arguments 之一。
template <typename T>
class MyClass {
public:
static std::function<T(T, T)> func1 = [](T a, T b) {
...
}
static std::function<T(T, T)> func2 = [](T a, T b) {
...
}
MyClass(std::function<T(T, T)> func) {
...
}
}
当我从这个 class 初始化 object 时:
MyClass<int> myObj(MyClass.func1);
编译器抱怨说:
> argument list for class template "MyClass" is missing.
在保留 class 本身的功能的同时,正确的方法是什么?
MyClass
是一个模板,而不是 class。 具有要传递给构造函数的 static 成员的 class 是MyClass<int>
。
您的代码有一些拼写错误(缺少;
),我必须为 static 成员的类内初始化添加inline
,我引入了一个别名,为简洁起见,我使用了struct
而不是class
(ZA2F2ED4F8E959C624DF1D456E5D3297Z 成员只有 public):
#include <iostream>
#include <functional>
template <typename T>
struct MyClass {
using fun_t = std::function<T(T,T)>;
static inline fun_t func1 = [](T a, T b) { return a+b; };
static inline fun_t func2 = [](T a, T b) { return a-b; };
fun_t fun;
MyClass(std::function<T(T, T)> func) : fun(func) {}
};
int main() {
auto x = MyClass<int>{MyClass<int>::func1};
std::cout << x.fun(1,2);
}
正如 AyxanHaqverdili 在评论中指出的那样,这也可以:
auto x = MyClass{ MyClass<int>::func1 };
由于 CTAD (类模板参数推导) ,其中 class 模板参数是从构造函数参数推导出来的。 现场演示
这也很好,虽然有点hacky,我不建议实际使用它:
MyClass<int> x { x.func1 };
简而言之:您可以在其自己的初始化程序中引用变量。 我们没有做需要完全初始化x
的事情,因此通过MyClass<int>
的实例访问(已经初始化的) static
成员没有问题。 现场演示
@HTNW 建议的一个不太可疑的变体是
MyClass<int> x{decltype(x)::func1};
现在更明显的是,我们只使用x
类型并访问其 class 的 static 成员。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.