我有以下代码可以正常工作:
template<typename T>
class Base {
virtual void call(T) = 0;
};
class Derived : public Base<int> {
void call(int);
}
template<typename T>
void registerBase(const Base<T>& ref) {}
这种方法可以在调用 as 时T
自动检测类型。当我切换到:int
registerBase(Derived())
shared_ptr
template<typename T, typename Q>
void registerBase(shared_ptr<Q> ptr) {
static_assert(is_base_of<Base<T>, Q>::value, "Have to supply a type extending Base<...>");
}
我可以防止非法类型,但我似乎无法自动检测类型T
。我可以使用一些技巧来自动将 shared_ptr 向下转换为Base<T>
模板推导工作吗?还是有另一种方法可以找到 typename T
?
PS:万一Q
扩展乘法Base<T>
我想出错(自动推演应该失败)。