【发布时间】:2021-02-24 17:57:26
【问题描述】:
我想要如下设置:
template <typename T> class a {};
class b : public a<int> {};
template <typename T>
void do_foo(std::unique_ptr<a<T>> foo)
{
// Do something with foo
}
int main()
{
do_foo(std::make_unique<b>());
}
编译失败,并带有 template argument deduction/substitution failed 和 mismatched types 'a<T>' and 'b' 的注释。这是不言自明的。我可以写do_foo<int>(std::make_unique<b>()); 来帮助编译器,但是我重复自己写int 两次。
在这种情况下,有没有办法让编译器推断出模板参数?你会怎么称呼这种行为?我尝试搜索诸如“继承类型的模板类型推导”、“多态模板推导”等内容。
【问题讨论】:
-
是的,它可以使用原始指针/引用。但是 unique_ptr 使它成为一个非首发。
-
不热衷于使用原始指针 - 我宁愿重复自己!
-
do_foo真的需要拥有指针的所有权吗?如果没有,请通过引用,void do_foo(const a<T>& var),然后取消引用调用站点的指针。 -
@NathanOliver 改变它是不值得的。我主要只是对比我更有知识的人说的话感兴趣。
-
有很多话要说。如果你有更多的论点,这个可以变成一个非演绎的上下文。或者您可以添加另一个重载。可能还有其他我想不起来的事情。但这篇文章不足以让任何人说出最好的建议。
标签: c++ templates polymorphism c++14