c++11 中的可变参数模板和多重继承

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

我正在努力实现这样的目标:

我有一个模板化基类,我想动态继承它

template<typename A, typename B>
class fooBase
{
public:
    fooBase(){};
    ~fooBase(){};
};

所需的方法:(类似这样,不太确定该怎么做)

template <typename... Interfaces>
class foo : public Interfaces...
{
public:
    foo();
    ~foo();
}

我的目标是让 foo 类的行为如下:

第二种方法:

class foo()
    : public fooBase<uint8_t, float>
    , public fooBase<uint16_t, bool>
    , public fooBase<uint32_t, int>
    // and the list could go on
{
    foo();
    ~foo();
}

使用第二种方法,问题是,如果我实例化一个 foo 对象,它将始终继承这 3 个基类,我想让它更通用,当实例化一个 foo 对象时,用可变参数模板为其提供参数基类,这样我就可以将 foo 类用于其他类型(也许只会继承一个基类,也许五个)

谢谢你

实例化 foo 的示例

foo<<uint8_t, float>, <uint16_t, bool>, <uint32_t, int>, /* and the list could go on and on */> instance
c++ templates c++11 inheritance variadic-templates
2个回答
5
投票

您可以尝试递归可变参数模板,一次采用 2 个参数来添加来自 fooBase 的派生。

可能是这样的:

template<typename A, typename B>
class fooBase
{
public:
    fooBase(){};
    ~fooBase(){};
};

template<typename A, typename B, typename ... C>
class foo: public fooBase<A, B>, public foo<C ...> {
};

// termination version by partial specialization
template<typename A, typename B>
class foo<A, B>: public fooBase<A, B> {
};

然后您可以声明:

foo<uint8_t, float, uint16_t, bool, uint32_t, int> bar;

和 bar 将是

fooBase<uint8_t, float>
fooBase<uint16_t, bool>
fooBase<uint32_t, int>

的子对象

5
投票

将 foo 更改为与此类似的内容:

template<typename... Interfaces>
class foo : public Interfaces... {
  public:
    foo(Interfaces... ifaces) : Interfaces(ifaces)... {}
};
© www.soinside.com 2019 - 2024. All rights reserved.