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++模板的艺术:类型参数、默认值和自动推导】
推荐阅读
- Python神器解密:掌握property特性巧管理属性
- std::atomic 现代C++中的原子:详解、代码及应用
- 为什么 Qt 成为 c++ 界面编程的第一选择
- 作为一名黑客/安全专家,应该掌握什么技能?熟悉哪些软件/工具?
- 编程语言大比拼:Python、Java、C、C++、Go 实现 'Hello World' 和九九乘法表"
- C++编程实践:IP哈希负载均衡算法
- 世界上十个最伟大的医学家,全球十项高科技所掌握的国家?
- MySQL 你不得不掌握的十大技能!
- Python 数据库操作模块大揭秘:带你轻松掌握这六种常见模块!
- C++空类的那点事儿
