gpt4 book ai didi

此类的 C++ 特征示例

转载 作者:IT老高 更新时间:2023-10-28 21:42:55 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com