以下可变参数模板以递归方式创建类并按顺序添加每个指定的成员:
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;
- 但这是不允许的,因为我们可能不会专门化别名模板。
答案 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;
如果正如评论中所阐明的那样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;