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;
};
我 运行 遇到了 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;
};