【问题标题】:Variadic templates and multiple inheritance in c++11c++11中的可变参数模板和多重继承
【发布时间】:2016-06-20 20:08:24
【问题描述】:

我正在尝试实现这样的目标:

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

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

【问题讨论】:

  • 好像有人问过类似的问题here
  • 您能否发布一个您希望如何实例化foo 的示例?
  • 您希望foo&lt;int,char,float,double&gt; 扩展为foo : fooBase&lt;int,char&gt;, fooBase&lt;float,double&gt; 吗?
  • 当然,我想像这样实例化它: foo instance, , , /* 并且列表可以继续下去 * />
  • @mihaipop 使用您要使用的确切语法将示例添加到问题本身

标签: c++ templates c++11 inheritance variadic-templates


【解决方案1】:

将 foo 更改为类似于以下内容:

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

  };

【讨论】:

    【解决方案2】:

    您可以尝试递归可变参数模板,一次采用 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&lt;uint8_t, float&gt;fooBase&lt;uint16_t, bool&gt;fooBase&lt;uint32_t, int&gt; 的子对象

    【讨论】:

      猜你喜欢
      • 2015-11-10
      • 2014-05-15
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      相关资源
      最近更新 更多