c++ - 如何使用自定义分配器创建 std::function?

标签 c++ c++11 allocator

为了节省一些代码,假设我有一个名为 MyAlloc 的自定义分配器我已经成功地使用了 std::vector<int>如下:

std::vector<int,MyAlloc<int>> vec;

现在我想使用自定义分配器在 std::function 中保存一个 lambda,我该怎么做?

我的失败尝试:

int i[100];
std::function<void(int)> f(MyAlloc<void/*what to put here?*/>{},[i](int in){
    //...
});

更新: std::function 中的分配器为 deprecated

最佳答案

按照标准,你需要给一个tag type作为第一个参数表明您要使用自定义分配器:

std::function<void(int)> f(std::allocator_arg, MyAlloc<char>{}, [i](int in){
    //...
});

正如 @Casey 所指出的那样和 @Potatoswatter在注释中,分配器的模板参数类型无关紧要,只要它是对象类型即可。所以 char 在这里很好。

C++17 更新:事实证明,对 std::function 的分配器支持存在许多基本问题,导致 being deprecated in C++17 .如果您仍然坚持使用它,请务必在这样做之前仔细检查您的实现。 GCC 的标准库从未实现过这些功能,但即使您的标准库实现了,它也可能不会像您期望的那样运行。

关于c++ - 如何使用自定义分配器创建 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094052/

相关文章:

c++ - 分配器 : how are the standard containers expected to work internally?

c++ - boost::unordered_map 使用 boost::interprocess::cached_node_allocator 编译失败

c++ - C++ 中的 const 双表达式

c++ - 使用友元类的单例实现(C++)

c++ - 根据用户请求停止 tbb 线程

c++ - 我的多晶型符合标准吗?

c++ - 为什么不是 std::string::max_size() == std::string::allocator::max_size()

c++ - 在 Visual Studio Code 中指定库路径?

c++ - 有没有办法在不知道 c++ 中的大小的情况下迭代枚举

c++ - 使用新的Mingw二进制文件在Cygwin中进行编译