在这里,多态的背景是期望'基础&。
中的'衍生'鉴于
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或其子类(如果可能的话证明我错了。)
答案 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);
。)