簡體   English   中英

具有可以是兩種類型之一的數據成員的類

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM