我有这样的自定义List类:
template<class T>
struct iList{
constexpr bool empty() const{
return static_cast<const T *>(this)->size() == 0;
}
// several methods like empty(), some are non const.
};
// there are several classes like this one with different implementations
struct MyList : iList<MyList>{
constexpr unsigned size() const{
return 5;
}
};
int main(){
constexpr MyList list;
static_assert( ! list.empty() );
}
代码为constexpr
并已简化,因此我可以使用static_assert
。
我想摆脱CRTP模式,因为模板变得太难看了。但是我不想使用虚函数。
我正在考虑的一种方式是:
struct iList2{
protected:
template<class LIST>
constexpr static bool empty_(const LIST &list){
return list.size() == 0;
}
};
struct MyList2 : iList2{
constexpr unsigned size() const{
return 5;
}
constexpr bool empty() const{
return empty_(*this);
}
};
int main(){
constexpr MyList2 list2;
static_assert( ! list2.empty() );
}
在这种情况下,我需要在每个列表中调用empty_
静态成员函数。
另一种方法是使用mixin,例如继承MyList
并添加empty()方法。如果我这样做模板类,我甚至可以制作typedef。但是我也不喜欢这种方法。
我有可能失踪吗?