模板的多态使用

Polymorphic use of templates

本文关键字:多态      更新时间:2023-10-16

这里,多态的上下文期望'Derived' from 'Base&

给定

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或其子类(如果可能,请证明我错了)。

你要做的就是一个模板模式:你有一个无限的返回类型和匹配的函数参数类型。这应该是一个简单的模板。

如果你想限制允许的类型,你应该添加一些类型trait的魔力。也许像这样:

#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);)