我有以下代码运行良好:
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) {}
这种方法可以自动检测类型 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>
所以模板推导有效吗?或者有另一种方法可以找到类型名 T
?
PS:万一Q
扩展乘法 Base<T>
我想出错(自动扣除应该失败)。
最佳答案
可能有无数种方法可以做到这一点。这是一个:
template<class T>
T helper(const Base<T> &); // not defined
template<class Q>
using base_param = decltype(helper(std::declval<Q>()));
在实际代码中,您可能希望输入 helper
在details
命名空间(也可能更改名称)。
如果您遇到 T
的奇怪情况,这将中断是无法返回的类型 - 例如,数组类型。通过更改 helper
很容易修复它的返回类型,例如 identity<T>
然后还更改了 base_param
的定义相应地。
关于c++ - 自动检测基类的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271307/