std::make_shared()智能感知识别构造参数原理及自定义实现问询
问题
std::make_shared() 用于直接构造 shared_ptr 对象,它接收目标类型构造函数的参数并调用对应构造函数。这里有个疑问:使用模板与可变参数时,Visual Studio 的智能感知通常仅显示模板的泛型定义,无法展示目标类型的构造函数定义,但 std::make_shared() 却能显示精确的构造函数定义。这是 Visual Studio 智能感知针对标准库的专属特性,还是 C++ 实现层面的机制?若为后者,如何自定义实现类似效果?
附自定义模板示例:
template<typename T, typename... types> std::shared_ptr<T> my_make_shared(types... args) { return std::shared_ptr<T>(new T(args...)); }
(注:同时提供了 std::make_shared() 与自定义模板的智能感知效果对比截图)
回答
说白了这是 Visual Studio 智能感知针对标准库的专属优化特性,不是 C++ 语言本身的机制。微软给标准库的核心模板(比如
std::make_shared、std::vector的构造函数这类)做了特殊的智能感知适配处理,能解析并展示目标类型的具体构造函数签名,普通自定义模板默认没这个待遇。要是想让自己写的模板也实现类似效果,可以用 Visual Studio 提供的 编译器扩展属性 或者智能感知注释,不过效果肯定不如标准库原生优化那么完善:
- 用
[[msvc::conform_variadic_function]]属性标记模板,告诉智能感知去尝试解析可变参数对应的目标构造函数:template<typename T, typename... types> [[msvc::conform_variadic_function]] std::shared_ptr<T> my_make_shared(types... args) { return std::shared_ptr<T>(new T(args...)); } - 另外也可以加 XML 格式的智能感知注释,手动指定提示内容,但这种方法比较麻烦,得逐个类型适配:
/// <summary>创建并返回指向T类型对象的shared_ptr</summary> /// <param name="args">传给T类型构造函数的参数</param> /// <typeparam name="T">被shared_ptr管理的对象类型</typeparam> /// <typeparam name="types">构造参数的类型列表</typeparam> template<typename T, typename... types> std::shared_ptr<T> my_make_shared(types... args) { return std::shared_ptr<T>(new T(args...)); }
- 用
要注意的是,这些自定义方法只能在 Visual Studio 里生效,属于非标准的编译器扩展,跨平台代码里别依赖这些东西。
内容的提问来源于stack exchange,提问作者furkan ünsal
相关产品推荐
相关产品推荐

