最好用一些代码来解释:
class MyClass {
public:
MyClass(const std::string& d1, const std::string& d2, const std::vector<AorB>& d3) : data1(d1), data2(d2), data3(d3) {}
std::string getData1();
std::string getData2();
std::vector<AorB> getData3();
private:
std::string data1;
std::string data2;
std::vector<AorB> data3;
}
int main() {
MyClass myClassA("d1", "d2", std::vector<A>());
MyClass myClassB("d1", "d2", std::vector<B>());
A myA = myClassA.getData3();
B myB = myClassB.getData3();
}
当使用boost变体或boost任何变量时,此工作流“几乎”可以工作,但是我要避免的事情是对getData3的结果调用boost :: get以获取实际类型。换句话说,我不希望MyClass的使用者必须知道A或B是否存储在data3中。我只希望他们能够调用getData3(),它是创建时传递的任何类型。
我认为可以通过具有模板专业化/递归继承的模板来实现,但是我还不太清楚如何使它正常工作。也许看起来像这样吗?
class MyClass {
public:
template <typename AorB>
MyClass(const std::string& d1, const std::string& d2, const std::vector<AorB>& d3) : data1(d1), data2(d2), data3(d3) {}
std::string getData1();
std::string getData2();
template <typename AorB>
std::vector<AorB> getData3();
private:
std::string data1;
std::string data2;
template <typename AorB>
std::vector<AorB> data3;
}
int main() {
MyClass myClassA<A>("d1", "d2", std::vector<A>());
MyClass myClassB<B>("d1", "d2", std::vector<B>());
A myA = myClassA.getData3();
B myB = myClassB.getData3();
}
但是,由于我们不能拥有非静态模板类成员,因此无法正常工作。
答案 0 :(得分:3)
要执行您要尝试的操作,您需要将模板整体应用于MyClass
,例如:
template <typename AorB>
class MyClass {
public:
MyClass(const std::string& d1, const std::string& d2, const std::vector<AorB>& d3) : data1(d1), data2(d2), data3(d3) {}
std::string getData1();
std::string getData2();
std::vector<AorB> getData3();
private:
std::string data1;
std::string data2;
std::vector<AorB> data3;
};
int main() {
MyClass<A> myClassA("d1", "d2", std::vector<A>());
MyClass<B> myClassB("d1", "d2", std::vector<B>());
A myA = myClassA.getData3();
B myB = myClassB.getData3();
}
答案 1 :(得分:0)
您可以在此处使用union来设置数据类型,无论它在创建时想要什么,也可以在检索时得到什么。 联合会为其所有成员分配一个公共内存位置。工会占用的内存将足以容纳工会的最大成员。
union AorB
{
A;
B;
};
然后在以上程序中使用