此类的 C++ 特征示例

标签 c++ templates traits

我已经有一段时间没有使用 C++ 的高级功能了,正在刷新我的 C++ 知识。 话虽如此,特征和基于策略的编程的概念是我从未真正理解的东西。

我想改变它。我正在编写一个通用容器。我想强制执行一个策略,即容器将只存储从特定基类派生的类。这是因为当尝试访问 vector 边界之外的项目时,容器会返回一个无效对象(而不是抛出)。

template <class T>   
class GenericContainer
{
private:
    typedef std::vector<T> TypeVect;
    void addElement(const T& elem);

    TypeVect m_elems;

public:
    unsigned int size() const;
    T& elementAt(const unsigned int pos);
    const T elementAt(const unsigned int pos) const;
};

我将如何使用特征来限制这个通用容器只包含类“ContainerItem”的子类?

最佳答案

您可以使用一个小的 IsDerivedFrom 模板,该模板只能在给定类型“D”继承另一个类型“B”的情况下被实例化(此实现取自 nice Guru Of The Week article):

template<typename D, typename B>
class IsDerivedFrom
{
  static void Constraints(D* p)
  {
    B* pb = p; // this line only works if 'D' inherits 'B'
    pb = p; // suppress warnings about unused variables
  } 

protected:
  IsDerivedFrom() { void(*p)(D*) = Constraints; }
}; 

// Force it to fail in the case where B is void
template<typename D>
class IsDerivedFrom<D, void>
{
  IsDerivedFrom() { char* p = (int*)0; /* error */ }
};

您现在可以使用继承简单地实例化 IsDerivedFrom 模板:

template <class T>   
class GenericContainer : public IsDerivedFrom<T, ContainerItem>
{
    ...
};

此代码仅在 T 继承 ContainerItem 时编译。

关于此类的 C++ 特征示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4760978/

相关文章:

C++ 编写自己的输入操纵器

c++ - 为枚举索引数组重载 std::get

C++ - 如何在自定义模板化数据容器中的迭代器上使用 advance() 启用 ADL?

rust - 如何将 Sized super 特征添加到 Rust 特征?

rust - 为动态 Fns 实现特征

c++ - 使用代码 :Blocks on Linux 的 C++ 函数中的 "Not Declared in scope"

c++ - 使用CUDA进行残差计算

c++ - 目前业界流行的C/C++ IDE

c++ - 模板嵌套私有(private)类作为 friend

rust - 具有返回 self 的特征的集合