Specializing std::make_shared
Specializing std::make_shared
我有一个具有严格对齐要求的类型(由于使用了AVX操作),它比平台默认对齐要大。
为了使该类的使用更简单,我想对std::make_shared
进行专门化,以便始终为该类型使用合适的分配器。
像这样:
namespace std{
template<class... Args> inline
auto make_shared<X, Args...>(Args&&... args){
return std::allocate_shared(allocator_type<X, 32>, std::forward<Args>(args)...);
}
}
我的问题是,这是标准允许的吗?它会像预期的那样起作用吗?
From N4140 [namespace. cn]/1(强调我的):
c++程序的行为是未定义的,如果它向命名空间std或命名空间std中的命名空间添加声明或定义,除非另有说明。程序可以添加模板专门化只有当声明依赖于用户定义的类型且专门化满足原始模板的标准库要求且未被明确禁止时,才能将任何标准库模板命名为std。
由于您正在添加依赖于用户定义类型的模板专门化,因此这是std
名称空间的有效扩展。
然而,正如@dyp所指出的,你不能部分专门化函数模板。您的最佳选择是显式地指定X
构造函数的参数(失去了完美转发),或者只是编写make_shared_x
函数(失去了一致性)。
这就是我最终得到一个不涉及大量样板文件的通用解决方案:
namespace xtd{
template< typename T, std::size_t align = std::alignment_of<T>::value, typename... Args >
std::shared_ptr<T> make_shared(Args&&... args){
// Platform specific knowledge.
#if defined(_WIN64) || defined(_WIN32)
#if defined(_WIN64)
const std::size_t default_alignment = 16;
#else
const std::size_t default_alignment = 8;
#endif
#else
#error "Only windows for now"
#endif
if (align > default_alignment) {
typedef aligned_allocator<T, align> alloc_type;
return std::allocate_shared<T, alloc_type>(alloc_type(), std::forward<Args>(args)...);
}
else {
return std::make_shared<T>(std::forward<Args>(args)...);
}
}
}
然后我找到Search &将std::make_shared
替换为xtd::make_shared
:)
相关文章:
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- make 命令如何避免重新编译未更改的源文件?
- MAKE:找不到包含的用户定义的头文件?
- 'make check' GLIBC 运行时的链接问题
- 引用 std::shared:ptr 以避免引用计数
- Qt5 [make -snap] 无法正确编译:进程"/usr/bin/snap"代码 1 退出
- mingw32-make 使用"MinGW Makefiles"生成器跟踪 CMAKE 无法将可执行文件链接到对象库
- make 命令创建 .file,但不创建应用程序文件
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- Qt Creator 在执行步骤 "make" 时出现编译错误,-fno-stack-limit
- 如何使用MySQL Connector and Make设置C++项目
- 使用 make 将对象文件放在特定目录中
- 我是 C++ 的新手,我试图调用 make 一个以 2 个类作为其参数的类构造函数
- "Make"失败并出现 Clang 错误 - 如何从 Clang 获得错误?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- 防止 GNU Make 在每次构建时生成 protobuf 代码
- Make zmqpp::socket::connect a std::future
- 链接从命令行转换为Make的库
- 将 make 和 cmake 合并到构建系统中