繁体   English   中英

如何使用该对象的 static 成员 function 初始化 object?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM