【发布时间】:2021-06-29 15:44:04
【问题描述】:
假设我正在尝试创建一个从给定基类派生的Combine 类。
template<typename ...Bases>
class Combine : public Bases... {};
这很好用。例如,如果我有Foo 和Bar 类,那么Combine<Foo, Bar> 类将实现Foo 和Bar 中的所有方法。至少在我尝试这个之前我是这么认为的:
struct ContainerProvider {
std::vector<int> container{1, 2, 3};
};
struct ConstGetter : public virtual ContainerProvider {
[[nodiscard]] const int &get(int index) const {
return container[index];
}
};
struct MutableGetter : public virtual ContainerProvider {
int &get(int index) {
return container[index];
}
};
template<typename ...Bases>
class Combine : public Bases... {};
int main() {
Combine<ConstGetter, MutableGetter> container;
container.get(1); // Member 'get' found in multiple base classes of different types
}
在正常情况下,我只会使用using Super::method;,但这里我不知道派生方法的名称。在一个完美的世界里,我可以使用这样的东西:
template<typename ...Bases>
class Combine : public Bases... {
using Bases::* ...;
};
但 C++ 不允许这样做。
是否有可能以某种方式实现我的Combine 类?我很确定编译器可以获取所有信息来解决这种极端情况,但我不知道如何提供它以使其工作。
【问题讨论】:
标签: c++ templates inheritance overloading template-meta-programming