2013-03-10 54 views
0

我想在共享内存中使用Boost进程库创建一个unordered_map。这里,是代码,这是我想要使用(以从升压进程间文件的例子):boost进程间unordered_map字符串

#include <boost/interprocess/managed_shared_memory.hpp> 
#include <boost/interprocess/allocators/allocator.hpp> 
#include <functional> 
#include <boost/functional/hash.hpp> 
#include <boost/unordered_map.hpp> 
#include <iostream> 
#include <string> 
#include <boost/interprocess/containers/string.hpp> 

namespace bipc = boost::interprocess; 

typedef bipc::allocator<char, bipc::managed_shared_memory::segment_manager> CharAllocator; 
typedef bipc::basic_string<char, std::char_traits<char>, CharAllocator> ShmemString; 


struct Person 
{ 
    int age; 
    ShmemString name; 
    double salary; 

    Person(int i, 
    double sal, 
    const char* s, 
    const char_allocator& a) 
    : age(i), 
     name(s, a), 
     salary(sal) 
    { 
    } 
    void print() {} 
} 

typedef ShmemString KeyType; 
typedef Person MappedType; 

typedef std::pair< KeyType, MappedType > MapPersonType; 


typedef bipc::allocator< MapPersonType, 
        bipc::managed_shared_memory::segment_manager > 
ShMemAllocator; 

typedef boost::unordered_map< KeyType, 
          MappedType, 
          boost::hash<KeyType>, 
          std::equal_to<KeyType>, 
          ShMemAllocator > 
PersonMap; 

这就是我想在主程序中要做到:

int main() 
{ 
bipc::managed_shared_memory segment(bipc::create_only, "MySharedMemory", 65536); 

PersonMap *persons = segment.construct<PersonMap>("MyHashMap") 
    (3, boost::hash<ShmemString>(), std::equal_to<ShmemString>() 
     , segment.get_allocator<MapPersonType>()); 

char_allocator alloc(segment.get_allocator<char>()); 

Person p1(20, 10000, "ABC", alloc); 
persons->insert(MapPersonType(ShmemString("Person1", alloc), p1)); 
} 

使用上面的代码,我可以在共享内存中创建一个unordered_map。然而,当我试图访问地图,我需要使用像

persons->at(ShmemString("H", segment.get_allocator<char>())).print(); 

语法但是,我宁愿用的std :: string,这会导致编译错误做到这一点:

persons->at(std::string("H")).print(); 

是否有可能编写上述语句,即使用std :: string访问共享内存中分配的映射?

+0

我发布在boost-users邮件列表上。并且,从Boost.Interprocess作者那里得到了一个答案,这是无法完成的。 – Lazylabs 2013-03-15 16:00:58

回答

2

我在boost-users邮件列表上发布了this。并且,从Boost.Interprocess作者那里得到了一个答案,这是无法完成的。

+0

请添加问题的链接。 – Ammar 2013-11-05 04:12:03

+1

现在添加了链接。 – Lazylabs 2013-11-20 08:10:30

相关问题