我知道这个问题已经得到了正确的回答,但是即使阅读了这篇文章和回复,我仍然在尝试重载std :: function的分配器时遇到了一些语法问题,这需要在X64、PS4和Xbox One上进行交叉编译,在VS2012中实现。
如果读者不清楚,您需要根据Casey的评论声明一个分配器类。虽然如果您阅读所有回复,这是相当明显的,但不清楚的是这些分配器是如何传递给对象的,它与我之前使用过的大多数STL分配器不同,后者将分配器类型(而不是实例)作为类型规范的一部分。
对于std :: function,构造函数提供了一个实例化的分配器,这就是ComicSansMS上面展示的内容。
对于使用成员函数而不是此示例中显示的lambda代码,情况会变得有点棘手:
#include <functional>
MyAllocType g_myAlloc;
class MyClassType
{
public:
void TestFunction( int param )
{
}
};
MyClassType MyClass;
std::function<void(MyClassType*, int)> f( std::mem_fn( &MyClassType::TestFunction ) );
f( &MyClass, 10 );
std::function<void(MyClassType*, int)> f(std::allocator_arg, g_myAlloc, std::mem_fn( &MyClassType::TestFunction ) );
f( &MyClass, 10 );
void NonMemberFunction( int param )
{
}
std::function<void(int)> f(std::allocator_arg, g_myAlloc, NonMemberFunction);
希望这能帮助人们。对我来说,让它工作起来的时间比我想象的要长,因为我经常使用这个网站,所以我觉得我应该在这里留下评论,即使只是为了自己知道如何使用它。:)
对于那些比我聪明的人有两个最终问题:
问:有没有办法将分配器作为类型的一部分包含进去?
问:有没有办法在没有对象实例的情况下使用成员函数?
如果您决定将其中一个 std::function 对象作为参数传递给其他函数,则需要使用 std::function::assign 进行更新,否则赋值将导致浅层复制。如果您试图将其传递给具有比原始对象更长的生命周期的对象,则可能会出现问题。
例如:
std::function<void(MyClassType*, int)> f(std::allocator_arg, g_myAlloc, std::mem_fn( &MyClassType::TestFunction ) );
void FunctionTakeParam( std::function<void(MyClassType*, int)> &FunctionIn )
{
std::function<void(MyClassType*, int)> MyLocalFunction.assign( std::allocator_arg, g_myAlloc, FunctionIn );
...
}
std::function
构造函数的文档,而你链接的是类本身。分配器仅在构造std::function
时需要,而不是在使用它时需要。因此,只有构造函数对分配器类型进行了模板化,而不是类本身。 - ComicSansMSstd::function
中删除分配器支持:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0302r0.html,其中列出了一些已知问题。 - Andriy Tylychko