c++ - 将模板化函数限制为基本类型和派生类型?

标签 c++ templates

我有一个这样的模板基类:

template<typename T, std::size_t Size>
class VectorT
{
public:
    typedef T data_type;
}

和一些专门的派生类:

template<typename T>
class Vector2d : public VectorT<T, 2U>
{ // some specialised functions }

template<typename T>
class Vector3d : public VectorT<T, 3U>
{  // some other specialised functions }

这些工作正常。但是,我有一些独立的运算符(operator)功能。例如:

template<typename T, size_t Size>
VectorT<T, Size> operator*(T lhs, const VectorT<T, Size>& rhs)
{
    ... 
}

不幸的是,这些不适用于我的派生类,因为它们返回 VectorT<T, Size>而不是 Vector2d<T> .

所以我尝试了

template<V>
V operator*(typename V::data_type lhs, const V& rhs)
{
    ... 
}

这很好用,但是它可能会导致歧义,因为它会吸收任何带有 data_type 成员的内容。

我如何解决这个问题:如何编写仅适用于我的 vector 基或其任何派生的类型安全函数?

我正在尝试避免为子类重新声明和重新定义运算符。

最佳答案

您可以添加另一个基类,一个独立于模板参数的基类,并使用 SFINAE禁用对不是从此类基础派生的类型的调用:

struct VectorBase {};

template< typename T, std::size_t Size >
class VectorT : public VectorBase { ... }

template< typename V >
typename boost::enable_if< boost::is_base_of< VectorBase, V >, V >::type
operator*( V lhs, V const& rhs ){ ... }

请注意 is_base_of< X, X >总是 true , 因此该函数将适用于比所需类型多的一种类型,即基类 VectorBase .

如果您使用的是实现 TR1 的编译器,您可以替换 boost::对于 std::在使用的两个地方。

关于c++ - 将模板化函数限制为基本类型和派生类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7987837/

相关文章:

c++ - C++ 模板声明中的范围和默认参数 : Clarifying Standardese

c++ - 刷新文件读取缓存

c++ - 解释以下程序的操作

c++ - SDL 2.0 - 无效的渲染器错误

c++ - 在类外将部分指定的模板化矩阵乘法运算符重载函数声明为友元

c++ - 具有模板容器的协变返回类型

c++ - 如何检查模板类中的变量是否为字符串类型?

c++ - 在 C++ 中比较两种数据类型?

templates - go:根据错误代码加载模板

css - Custom.css 未在 PrestaShop 1.7 中运行