我已经有一段时间没有使用 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/