缩短作为模板参数传递给CRTP的长模板派生类(“传递给我”)

时间:2017-05-13 01:49:49

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

我想将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>{

};

OR

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

};

我糟糕的解决方案

  • 使用宏#define MEEEEEEE Derived<T1,T2,T3>

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

    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>>{
    
    };
    

1 个答案:

答案 0 :(得分: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是模板别名(使用声明),用于锁定除derived之外的所有模板参数。

相关问题