从模板成员类型派生模板类的成员变量类型

时间:2021-05-03 09:46:03

标签: c++ templates type-deduction

标题可能看起来有点混乱,所以这里有一个更彻底的解释:

我有一个模板类,它有一个向量作为成员变量。模板参数是一个结构(或类),它将具有一个特定的变量。这个向量的类型应该从模板参数(从这个某个变量)派生出来。棘手的部分是它应该从模板参数的成员变量中派生出来。

#include <vector>
#include <complex>
using namespace std;

struct thingA {
    double variable;
    //...
};

struct thingB {
    complex<double> variable;
    //...
};


template <class S>
class someClass {
    vector< " type of S::variable " > history; // If S=thingA, make it a double, if S=tingB make it a complex<double>
}

// Usage:
someClass<thingA> myInstanceA; // (this instance should now have a vector<double>)

someClass<thingB> myInstanceB; // (this instance should now have a vector<complex<double>>)

2 个答案:

答案 0 :(得分:17)

您可以通过decltype获取类型,如果数据成员的名称始终相同:

template <class S>
class someClass {
    vector< decltype(S::variable) > history; // if S=thingA, make it a double, if S=tingB make it a complex<double>
};

答案 1 :(得分:14)

我会在 struct 中定义类型并在 class 中使用它:

#include <vector>
#include <complex>
using namespace std;

struct thingA {
    using Type = double;
    Type variable;
    //...
};

struct thingB {
    using Type = complex<double>;
    Type varbiable;
    //...
};


template <class S>
class someClass {
    vector<typename S::Type> history; // if S=thingA, make it a double, if S=tingB make it a complex<double>
};

// usage:
someClass<thingA> myInstanceA; // (this instance should now have a vector<double>)

someClass<thingB> myInstanceB; // (this instance should now have a vector<complex<double>>)

https://godbolt.org/z/raE9hbnqW

当变量名称不同时,这也是要走的路。