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你可以找到一个基本的例子。