摆脱可变参数模板递归基本情况下不必要的类

Get rid of unnecessary class in variadic template recursion base case

本文关键字:情况下 不必要 递归 变参 参数      更新时间:2023-10-16

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

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;- 但这是不允许的,因为我们可能不会专门化别名模板。

你可以完全得到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;

[现场示例]