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

odi*_*erd 16 c++ allocator c++11

为了保存一些代码,我可以说我有一个名为的自定义分配器MyAlloc,我已成功使用std::vector<int>如下:

std::vector<int,MyAlloc<int>> vec;
Run Code Online (Sandbox Code Playgroud)

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

我失败的尝试:

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

更新: std :: function中的分配器已被删除

Com*_*sMS 17

根据标准,您需要提供标记类型作为第一个参数,以指示您要使用自定义分配器:

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

正如@Casey@Potatoswatter在评论中所指出的那样,赋予分配器的模板参数类型无关紧要,只要它是一个对象类型即可.所以char这里很好.

更新C++ 17:事实证明,分配器支持std::function有许多基本问题,导致它在C++中弃用 17.如果您坚持使用它,请务必在执行此操作之前仔细检查您的实施.GCC的标准库从未实现过这些功能,但即使您的标准库具有这些功能,它也可能不会像您期望的那样运行.

  • @PorkyBrain C++11§[func.wrap.func.con]/1 state"当调用任何带有`allocator_arg_t`类型的第一个参数的函数构造函数时,第二个参数应该具有符合要求的类型分配器(表17.6.3.5).如果需要,allocator参数的副本用于为构造的`function`对象的内部数据结构分配内存.因此任何符合标准的分配器类型都是合适的. (3认同)
  • `void` 不是有效的分配器类型参数。尽管定义了 `std::allocator&lt;void&gt;`,但分配器通常需要对象类型。由于任何任意对象类型都可以,因此 `char` 是更好的选择。 (2认同)