在variadic模板递归基础案例中摆脱不必要的类

时间:2018-02-21 13:11:30

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

以下可变参数模板以递归方式创建类并按顺序添加每个指定的成员:

class Dummy {};

template<class Base, typename... Members>
// using Composition = Base;
class Composition : public Base {};

template<class Base, typename FirstMember, typename... MoreMembers>
class Composition<Base, FirstMember, MoreMembers...>
    : public Composition<Base, MoreMembers...> {
protected:
    FirstMember member;
};

Composition<Composition<
    Composition<Dummy, int>, Composition<Dummy, int>*>, double> composition;

它有效,但我觉得终止步骤有点笨拙:它创建了一个新的Composition<Base>类,它继承自Base但没有做任何其他事情。我希望最后一步可能只是template<class Base, typename... Members> using Composition = Base; - 但这是不允许的,因为我们可能不会专门化别名模板。

1 个答案:

答案 0 :(得分:3)

你可以完全得到Dummy的tid并使1参数形成停止条件:

template<typename... Members>
class Composition;

template<typename FirstMember, typename... MoreMembers>
class Composition<FirstMember, MoreMembers...>
    : public Composition<MoreMembers...> {
protected:
    FirstMember member;
};

template<typename FirstMember>
class Composition<FirstMember>
{
protected:
    FirstMember member;
};

Composition<Composition<
    Composition<int>, Composition<int>*>, double> composition;

[Live example]

如果正如评论中所阐明的那样Base是设计的重要部分,那么您应该能够通过添加一层间接来实现您想要的目标:

template <class Base, class... Members>
struct CompositionHelper;

template <class Base, class... Members>
using Composition = typename CompositionHelper<Base, Members...>::Type;

template <class Base>
struct CompositionHelper<Base>
{
  using Type = Base;
};

template <class Base, class FirstMember, class... MoreMembers>
struct CompositionHelper<Base, FirstMember, MoreMembers...>
{
  class Type : public Composition<Base, MoreMembers...>
  {
  protected:
    FirstMember member;
  };
};

Composition<Composition<
    Composition<Dummy, int>, Composition<Dummy, int>*>, double> composition;

[Live example]