C++:分配多个接口的可能性

C++: Possibility to assign multiple Interfaces

我 运行 遇到了 st运行ge 情况,我想知道是否有更好的方法来实现它。我将非常感谢您的建议。 归结为这个简单的核心问题:

  //Interface I1 and I2 shall not be combined, since that makes logically no sense
class I1 {
public:
  virtual void foo() = 0;
};

class I2 {
public:
  virtual void bar() = 0;
};

//Some classes implements both interfaces I1 and I2 (some others don't, but that's not relevant here)
class A : public I1, public I2 {
public:
  void foo() override {};
  void bar() override {};
};

class B : public I1, public I2 {
public:
  void foo() override {};
  void bar() override {};
};

//Since there is no logically meaningful parent for I1 and I2, I have to do something like this,
//to access both interfaces of class A and B
struct pair_t {
  I1& accessViaI1;
  I2& accessViaI2;
};

A a;
B b;

std::deque<pair_t> items;

items.push_back({ a, a });
items.push_back({ b, b });

代码运行正常,因为有用于双端队列的引用,性能应该不会太差。但至少最后几行对我来说看起来很 st运行ge 。有谁知道如何编写代码?或者也许是对一般结构的建议? 主要问题是,I1 和 I2 在逻辑上是完全分离和独立的。但是如果一个对象同时实现了这两者,我就需要它们。 与 class A 和 B 相同,将它们组合在一起(既不是通过继承也不是组合)是没有意义的

我可以使用 C++11 和 boost。 非常感谢您的提前帮助。

请尝试 variant

using variant = std::variant<A, B>;
variant a = A();
variant b = B();
std::deque<variant> items;
items.push_back(a);
items.push_back(b);

variant 自 c++17 起有效,但 boost 也可能具有此功能。

改进

items.push_back({ a, a });
items.push_back({ b, b });

进入

items.push_back({ a });
items.push_back({ b });

您可以向 pair_t

添加构造函数
struct pair_t {
  pair_t(I1& accessViaI1, I2& accessViaI2) :
      accessViaI1(accessViaI1),
      accessViaI2(accessViaI2)
  {}

  template <typename T,
           typename std::enable_if<std::is_base_of<I1, T>::value
                                && std::is_base_of<I2, T>::value, int>::type = 0>
  pair_t(T& t): pair_t(t, t) {}

  I1& accessViaI1;
  I2& accessViaI2;
};

Demo