下面的可变模板递归地创建类,并按顺序添加每个指定的成员:
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;它可以工作,但我觉得终止步骤有点笨拙:它创建了一个继承自Base但不做其他任何事情的新类Composition<Base>。我更希望最后一步可以是template<class Base, typename... Members> using Composition = Base; -但这是不允许的,因为我们可能不会专门化别名模板。
发布于 2018-02-21 21:21:49
您可以只获取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]
https://stackoverflow.com/questions/48906841
复制相似问题