我想将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>>{
};
答案 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之外的所有模板参数。