c++ - 基于某些模板参数从多个基类访问 corect 方法,而不用隐藏它们

标签 c++ templates inheritance polymorphism

我有以下草图

//g++  7.4.0

#include <iostream>

template<int T>
struct X {
    static int type() { return T; };    
};

template<typename T>
struct FooBase {
    int foo() { return T::type(); }
};

struct Foo : public FooBase<X<1>>, public FooBase<X<2>> {
    
    template<int T>
    int foo() { return FooBase<X<T>>::foo(); }
};

int main()
{
    std::cout << "Hello, world!\n";
    
    Foo fobj;
    
    std::cout << fobj.foo<1>() << std::endl;
    std::cout << fobj.foo<2>() << std::endl;
}
每当我调用 fobj.foo<1>() 时,此示例都有效或 fobj.foo<2>()调用来自其相应基类的正确 foo 方法。
我的问题是是否有办法摆脱这种“包装”方法
template<int T>
int foo() { return FooBase<X<T>>::foo(); }
Foo 类中的方法,并以其他方式从基类中访问正确的方法。我问这个是因为我们假设 FooBase class 已经有很多方法了,我不喜欢 class Foo我需要创建该包装器只是为了从基类调用正确的方法。

最佳答案

所以这是你可以做到的一种方法。作为您的Foo派生自基础,您可以通过将以下函数添加到 Foo 来提前一步添加消歧。 :

template<int I>
FooBase<X<I>>& as_base() { return static_cast<FooBase<X<I>>&>(*this); }
调用站点看起来像
Foo f;
f.as_base<1>().foo();
仍然不是很漂亮,但至少您不必为所有函数编写委托(delegate)。
查看完整示例 here.

关于c++ - 基于某些模板参数从多个基类访问 corect 方法,而不用隐藏它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62796543/

相关文章:

c++ - 如何获取内存区域的保护标志,标志是mprotect中的PROT_READ/PROT_EXEC

c++ - 将模板函数绑定(bind)到 gtkmm 信号时出现编译错误

C++ 模板重载 - 调用了错误的函数

java - 正确使用 Java 接口(interface)

Ruby:选择性类继承?

Python避免子类中的实现方法名称冲突

c++ - 偶数和奇数位置元素之和的最大差值 : How to memoize the brute-force approach?

c++ - 使用 autoconf 从二进制文件生成对象 (.o) 的自定义命令

c++ - 寻找fat32源

c++ - 我可以使用动态数组作为 C++ 模板类型名吗?