CRTP 的替代品
Alternatives to CRTP
假设我们有以下 class 和 virtual method
:
struct icountable{
virtual int count() = 0;
bool empty(){
return count() == 0;
}
}
struct list : public icountable {
...
}
现在假设这可以用 CRTP
重写。应该看起来或多或少像:
template <typename T>
struct icountable{
bool empty(){
return static_cast<T*>(this)->count() == 0;
}
}
struct list : public icountable<list> {
...
}
现在假设 class 本身不需要使用 empty() 方法。然后我们可以这样做:
template <typename T>
struct icountable : public T{
bool empty(){
return count() == 0;
}
}
struct list_base{
...
}
typedef icountable<list_base> list;
我的问题是针对第三个例子。这就是所谓的traits
吗?如果我使用它们有优点/缺点吗?
正如评论所说,这是mix-in概念,你可以找到相关信息here。
特征不同,here你可以找到一个基本的例子。
假设我们有以下 class 和 virtual method
:
struct icountable{
virtual int count() = 0;
bool empty(){
return count() == 0;
}
}
struct list : public icountable {
...
}
现在假设这可以用 CRTP
重写。应该看起来或多或少像:
template <typename T>
struct icountable{
bool empty(){
return static_cast<T*>(this)->count() == 0;
}
}
struct list : public icountable<list> {
...
}
现在假设 class 本身不需要使用 empty() 方法。然后我们可以这样做:
template <typename T>
struct icountable : public T{
bool empty(){
return count() == 0;
}
}
struct list_base{
...
}
typedef icountable<list_base> list;
我的问题是针对第三个例子。这就是所谓的traits
吗?如果我使用它们有优点/缺点吗?
正如评论所说,这是mix-in概念,你可以找到相关信息here。
特征不同,here你可以找到一个基本的例子。