多态使用模板

时间:2011-12-16 12:11:27

标签: c++ templates polymorphism

在这里,多态的背景是期望'基础&。

中的'衍生'

鉴于

class P { };
class Q : public P { };
auto operator + (const P& p, int x) -> DYNAMIC_DECLTYPE(P) {
    DYNAMIC_DECLTYPE(P) p2(p);
    p2.func(x);
    return p2;
}

有没有办法让DYNAMIC_DECLTYPE工作?我想使用此表单而不是

template <typename T> T operator + (const T& t, int x)

或有一个可能很长的

列表
if (!strcmp(typeid(p).name(), typeid(derived()).name()) { ... }

因为后者不能用来限制T到P或其子类(如果可能的话证明我错了。)

1 个答案:

答案 0 :(得分:1)

你要做的是模板模式的每个意义:你有一个带有匹配函数参数类型的返回类型的无界 family 。这应该只是一个直接的模板。

如果要限制允许的类型,则应添加一些typetrait魔法。也许是这样的:

#include <type_traits>

template <typename T>
typename std::enable_if<std::is_base_of<P, T>::value, T>::type
operator+(T const & t, int x)
{
    T s(t);
    s.func(x);
    return s;
}

(如果func返回引用,则可以将其快捷方式设为return T(t).func(x);。)