Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 自动检测基类的类型参数_C++_Templates_C++11_Template Argument Deduction - Fatal编程技术网

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
以便模板推断工作?或者有没有其他方法可以找到typename
T


注:如果
Q
extends multiply
Base
我想出错(自动扣除应该失败)。

可能有无数种方法可以做到这一点。这里有一个:

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