[英]Class with data member that can be one of two types
可能最好用一些代碼來解釋:
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 any 時,此工作流程“幾乎”有效,但我試圖避免的是在 getData3 的結果上調用 boost::get 以獲取實際類型。 換句話說,我不希望 MyClass 的使用者必須知道 data3 中存儲的是 A 還是 B。 我只是希望他們能夠調用 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();
}
但是這不起作用,因為我們不能有非靜態模板類成員。
要執行您正在嘗試的操作,您需要將模板整體應用於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();
}
您可以在此處使用 union 來設置創建時所需的數據類型以及檢索時獲得的數據類型。 Union 為其所有成員分配一個公共內存位置。 一個聯合所占用的內存將足夠容納該聯合中最大的成員。
union AorB
{
A;
B;
};
然后在上面的程序中使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.