摆脱可变参数模板递归基本情况下不必要的类
Get rid of unnecessary class in variadic template recursion base case
以下可变参数模板递归创建类并按顺序添加每个指定成员:
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;
[现场示例]
相关文章:
- 为什么在某些情况下不写入此文件?
- G++ C++17 类模板参数推导在非常特殊的情况下不起作用
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- c++ 选择排序在特定情况下不起作用
- 为什么在这种情况下不调用我的虚拟函数实现?
- 为什么在以下情况下不需要为依赖类型使用typename
- 为什么C++默认情况下不移动构造右值引用?
- 寻找有关为什么此C++代码在没有引用的情况下不起作用的解释
- 为什么在这种情况下不能将 Max 用作函数?
- 如果在开关情况下不匹配,为什么此函数返回 ASCII 值?
- 如何对 int 变量应用验证,使其仅接受整数数据,并且在任何其他数据的情况下不会出错?
- 为什么在这种特殊情况下不需要将 std::hash() 的专用化注入到 std 命名空间中?
- 句子转换器在存在新行的情况下不起作用
- 为什么 std::void_t 在这种情况下不起作用
- 摆脱可变参数模板递归基本情况下不必要的类
- C++中的dynamic_cast在没有 RTTI 的情况下不起作用;为什么?
- 递归返回函数,在特殊情况下不返回
- 为什么GetEffectiveRightsFromAcl在这种情况下不返回任何权利?
- 为什么SFINAE在这种情况下不起作用?