簡體   English   中英

從構造函數內部-有條件地調用成員變量的構造函數重載

[英]From within a constructor - conditionally call constructor overloads for member variable

背景:

我想做的事情類似於以下內容(代碼不起作用):

class A {
public:
  A(TypeX a)
  {
    /* initialize using TypeX */
  }
  A(TypeY a)
  {
    /* initialize using TypeY */
  }
};


class B {
private:
  A a;
  static const TypeX x;
  static const TypeY y;

public:
  B(bool useTypeX)
    : a(useTypeX ? x : y)
  {}
};

TypeX B::x;
TypeY B::y;

這將是我想要的代碼(如果語言支持),但是B :: a的初始化列表結構中的三元運算符在編譯時不會對兩種不同的類型執行重載解析(請參閱: https:/ /stackoverflow.com/a/8535301/1689844 )。

請注意,我只能控制B類的設計。 A類,TypeX和TypeY是完全不同的類型,並且不受我的控制(而且,TypeX和TypeY不共享公共基類,TypeX也不能轉換成TypeY,反之亦然)。 而且,類A的初始化成本很高(因此,復制構造函數不可行)。

題:

我想知道是否有人比下面的類B實現更理想的解決方案來實現我的期望行為。歡迎使用C ++ 11功能的答案,但是我僅限於使用C ++ 03,因此我將僅接受利用C ++ 03功能的答案:

class B {
private:
  SomeSmartPointer<A> a;
  static const TypeX x;
  static const TypeY y;

public:
  B(bool useTypeX)
  {
    // SomeSmartPointer is a smart pointer
    //    which uses reference-counting to
    //    delete allocated memory when the
    //    reference count is 0 and it is
    //    copy-constructable
    if (useTypeX)
    {
      SomeSmartPointer<A> tmp(x);
      a = tmp;
    }
    else
    {
      SomeSmartPointer<A> tmp(y);
      a = tmp;
    }
  }
};

TypeX B::x;
TypeY B::y;

如果A是可復制構造的(或可移動構造的,但由於您不使用C ++ 11而無關緊要),則可以執行

class B {
private:
  A a;
  static const TypeX x;
  static const TypeY y;
  static A initA(bool useTypeX)
  {
    if (useTypeX)
       return A(x);
    else
       return A(y);
  }
public:
  B(bool useTypeX)
    : a(initA(useTypeX))
  {}
};

編輯:當然,考慮一下,這是合法的,不需要額外的功能。 關鍵是要明確創建它們。 參見https://ideone.com/yUIF0Z

B(bool useTypeX) : a( useTypeX ? A(x) : A(y) ) {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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