c++ - 自动检测基类的类型参数

标签 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) {}

这种方法可以自动检测类型 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>())); 

在实际代码中,您可能希望输入 helperdetails命名空间(也可能更改名称)。

如果您遇到 T 的奇怪情况,这将中断是无法返回的类型 - 例如,数组类型。通过更改 helper 很容易修复它的返回类型,例如 identity<T>然后还更改了 base_param 的定义相应地。

关于c++ - 自动检测基类的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271307/

相关文章:

c++ - Unresolved inclusion : <thread>

c++ - 为什么不推荐使用 std::shared_ptr::unique() ?

c++ - 如何为 GTK3 配置 VSCode 以进行智能感知/构建/调试和 g++

c++ - 显式模板特化错误

c++ - 分配器感知容器分配是如何实现的?

c++ - 使用 c++0x 初始化列表时出现段错误

java - 对 Java 电子邮件模板的建议?

c++ - 如果类型 T 和 U 相同,则函数模板无法推导类型

c++ - 为什么C++11中signed char的范围是-127到127?

c++ - 为什么我不能重载传递给 std::upper_bound 的这个比较器