【发布时间】:2020-10-21 08:30:27
【问题描述】:
假设我有一个模板化基类,以及一个从它派生的模板化类:
template <typename T>
class Base {};
template <typename T>
class Derived : public Base<T> {};
此外,我有一个函数想要接受指向任何Base<T> 或子类的共享指针,并且能够轻松地将T 参数用作其签名的一部分:
template <typename T>
T DoSomething(std::shared_ptr<Base<T>>);
我希望能够调用它,推断出 T,共享指向 Base<T> 的指针或派生自它的任何东西:
DoSomething(std::make_shared<Base<T>>());
DoSomething(std::make_shared<Derived<T>>());
当然后者不行,因为类型推导失败。
如何修改DoSomething 的签名以使其正常工作?在Base 和Derived 不是模板的情况下,我已经看到了很多答案,但是如果我仍然想推断T(例如将其用作返回类型,如上)。
理想情况下,在重载解决时,指向非派生输入(和非共享指针)的共享指针会失败。
【问题讨论】:
标签: c++ templates sfinae typetraits type-deduction