C++ 自动检测基类的类型参数
我有以下工作正常的代码:C++ 自动检测基类的类型参数,c++,templates,c++11,template-argument-deduction,C++,Templates,C++11,Template Argument Deduction,我有以下工作正常的代码: 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) {} 我可以防止非法类型,但似乎无法自动检测类
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
。是否有一些技巧可以用来自动将共享的ptr向下转换到Base
以便模板推断工作?或者有没有其他方法可以找到typenameT
注:如果
Q
extends multiplyBase
我想出错(自动扣除应该失败)。可能有无数种方法可以做到这一点。这里有一个:
template<class T>
T helper(const Base<T> &); // not defined
template<class Q>
using base_param = decltype(helper(std::declval<Q>()));
模板
T辅助对象(常数基&);//未定义
模板
使用base_param=decltype(helper(std::declval());
在实际的代码中,您可能希望将helper
放在details
名称空间中(也可能更改名称)
如果
T
是一种无法返回的类型(例如,数组类型),则会出现这种情况。通过将helper
的返回类型更改为,例如identity
,然后也相应地更改base_参数的定义,可以很容易地修复它。模板T helper(const base&);使用base_param=decltype(helper(std::declval())的模板代码>@T.C.我相信这是正确的答案。请作为答案而不是评论发布。register
是一个关键词谢谢Jonathan,我修正了我希望它不是一个关键词的问题,因为我已经尝试过好几次这样使用它,当它无法编译时,我会说“doh!”)
template<class T>
T helper(const Base<T> &); // not defined
template<class Q>
using base_param = decltype(helper(std::declval<Q>()));