【发布时间】:2021-02-15 16:15:49
【问题描述】:
我目前正在尝试编写一个管道,该管道能够处理每个管道元素中的不同类型的数据。现在我想将unique_ptrs 与某种模板多态性和模板特化一起使用。
struct Start {}; // Dummy struct
template<typename In, typename Out>
class PipelineElement {
public:
virtual Out process(In in) = 0;
};
// partial template specialization for the first pipeline element
template<typename Out>
class PipelineElement<Start, Out> {
public:
virtual Out process() = 0;
};
class Producer : public PipelineElement<Start, int> {
int process() override { ... }
};
现在一个函数应该采用一个部分专门化的PipelineElement 的unique_ptr。但是,以下内容不会编译并出现错误消息:
auto Pipeline::setStart
(std::unique_ptr ,std::default_delete >>)':无法从 'std::unique_ptr 转换参数 1 >' 到 'std::unique_ptr ,std::default_delete >>
class Pipeline {
template<typename Out>
static auto setStart(std::unique_ptr<PipelineElement<Start, Out>> element) { ... }
};
int main() {
Pipeline::setStart(std::make_unique<Producer>());
}
如果我改用常规指针,它编译时不会出现任何错误。
为什么普通指针的版本能编译,而智能指针的版本不能?
class Pipeline {
template<typename Out>
auto setStart(PipelineElement<Start, Out>* element) { ... }
};
int main() {
Pipeline::setStart(new Producer());
}
【问题讨论】:
-
但请注意,通过
PipelineElement<Start, int>*指针删除Producer对象将无法正常工作,因为PipelineElement没有virtual析构函数,因此Producer析构函数不会不会被调用 (proof)。
标签: c++ templates polymorphism smart-pointers