具有数据成员的类可以是两种类型之一

问题描述 投票:1回答:2

可能最好用一些代码来解释:

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();
  }

但是由于我们不能有非静态模板类成员,所以这行不通。

c++ class templates variant any
2个回答
2
投票

要做您想做的事情,您需要将模板整体应用于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();
  }

0
投票

您可以在此处使用union来设置数据类型,无论它是创建时想要的,还是检索时得到的。联合会为其所有成员分配一个公共内存位置。工会占用的内存将足以容纳工会的最大成员。

union AorB
   {
         A;
         B;
   };

然后在以上程序中使用

© www.soinside.com 2019 - 2024. All rights reserved.