掌握C++模板的艺术:类型参数、默认值和自动推导( 三 )

std::unique_ptr 和 shared_ptr 无效 。您向它们的构造函数传递 T*,这意味着编译器必须在推导 <T> 或 <T[]> 之间选择 , 如果选错了就会很危险 。因此,请记?。?对于 unique_ptr 和 shared_ptr,您需要继续使用 make_unique() 和 make_shared()
用户定义的推导指南您也可以编写自己的用户定义推导指南来帮助编译器 。这些指南允许您编写模板参数如何被推导的规则 。这是一个高级主题,所以不会详细讨论,但会给出一个示例来展示它们的强大功能 。假设您有以下 SpreadsheetCell 类模板:
template <typename T>class SpreadsheetCell {public:    SpreadsheetCell(T t) : m_content { move(t) } { }    const T& getContent() const { return m_content; }private:    T m_content;};使用自动模板参数推导,您可以创建一个 std::string 类型的 SpreadsheetCell
string myString { "Hello World!" };SpreadsheetCell cell { myString };然而 , 如果您将 const char* 传递给 SpreadsheetCell 构造函数,则类型 T 被推导为 const char*,这不是您想要的!您可以创建以下用户定义的推导指南,当向构造函数传递 const char* 作为参数时,使其将 T 推导为 std::string
SpreadsheetCell(const char*) -> SpreadsheetCell<std::string>;这个指南必须在类定义
之外但在与 SpreadsheetCell 类相同的命名空间内定义 。通用语法如下 。explicit 关键字是可选的,其行为与构造函数的 explicit 相同 。通常 , 这样的推导指南也是模板 。
explicit TemplateName(Parameters) -> DeducedTemplate; 

【掌握C++模板的艺术:类型参数、默认值和自动推导】


推荐阅读