【问题标题】:Shorten long-template derived-class that passed as template argument into CRTP ("pass me")缩短作为模板参数传递给 CRTP 的长模板派生类(“通过我”)
【发布时间】:2017-05-13 01:49:49
【问题描述】:

我想将Derived 类作为模板参数Base<T> 类传递。

当我的Derived 类是一个模板并且它很长时,我的代码有轻微的可维护性和可读性问题,例如

template<class Derived>class Base{ //library : don't modify me

};
template<template<class>class T1,class T2,class T3>class Derived : //user class
  public Base<Derived<T1,T2,T3>>{

};

在某些情况下,Derived 有很多模板,我必须重新输入/复制粘贴几次:-

template<template<class>class T1,class T2,class T3>class HyperDatabase : //user class
  public IndexManager<HyperDatabase<T1,T2,T3>>,
  public AwesomeHash<HyperDatabase<T1,T2,T3>,BitShifter>,
  public Allocator<AlloDefault,HyperDatabase<T1,T2,T3>> { // etc...

};

问题

有没有办法让它更简洁?

我的梦想是:-

template<template<class>class T1,class T2,class T3>class Derived : //user class
  public Base<Derived>{

};

template<template<class>class T1,class T2,class T3>class Derived : //user class
  public Base<MEEEEEEE>{

};

我的糟糕解决方案

  • 使用宏#define MEEEEEEE Derived&lt;T1,T2,T3&gt;

  • 双重继承:太尴尬了:-

    template<class T>class Base2:  public Base<T>{};//user class
    template<template<class>class T1,class T2,class T3>class Derived : //user class
      public Base2<Derived<T1,T2,T3>>{
    
    };
    

【问题讨论】:

    标签: c++ templates c++14 crtp maintainability


    【解决方案1】:

    你可以写一个可变的 crtp 组合器:

    template <class T, template <class> ...Cs>
    struct CrtpCombiner : Cs<T>... {};
    

    用法:

    template<template<class>class T1,class T2,class T3>class 
    HyperDatabase : CrtpCombiner<HyperDataBase<T1, T2, T3>, 
    IndexManager, BitHash, DefaultAllocator>-
     { // etc...
    };
    

    其中 BitHash 和 DefaultAllocator 是模板别名(使用声明),它们锁定除派生之外的所有模板参数。

    【讨论】:

    • 我从未见过这样的事情。我发现谷歌搜索“variadic crtp combiner”没有有趣的结果。请详细说明一下好吗?
    • 如果IndexManagerBitHashDefaultAllocator 具有不同的模板参数顺序(如示例中所示),我认为我不会工作得那么好。但是感谢您提供新知识。
    • 它们不会有不同的顺序,正如我提到的那样,它们也可以是只接受一个参数的别名。
    • 对不起,我没有仔细阅读。我现在明白了……在这种复杂的情况下,这个解决方案需要更多的工作。
    • 嗯,两个一班,但肯定。可能无论如何都可以重用像 Def​​aultAllocator 这样的别名。如果您始终坚持将派生参数(无论如何都是好主意)放在首位,那么您可以做一些更好的事情来避免别名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多