2

背景:

我想做的是类似于以下内容(代码不起作用):

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;
4

1 回答 1

3

如果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) ) {}
于 2013-11-06T20:30:51.897 回答