Reputation: 3729
Is there a simple way to do this? I've tried the following:
typedef allocator<char,managed_shared_memory::segment_manager>
CharAllocator;
typedef boost::container::basic_string<char, std::char_traits<char>, CharAllocator>
my_basic_string;
std::string s(my_basic_string);
Upvotes: 6
Views: 4479
Reputation: 392863
Just copy element-wise (which any decent standard library implementation optimizes into memcpy
):
#include <boost/interprocess/managed_shared_memory.hpp>
#include <iostream>
using namespace boost::interprocess;
typedef allocator<char, managed_shared_memory::segment_manager> CharAllocator;
typedef boost::container::basic_string<char, std::char_traits<char>, CharAllocator> my_shared_string;
std::string s(my_shared_string const& ss) {
return std::string(ss.begin(), ss.end());
}
I called the string "my_shared_string" (because it's not any more "basic" than std::string). In fact it's good to notice this has everything to do with containers with custom allocators, and nothing with std::string or Boost Interprocess in particular:
typedef std::basic_string<char, std::char_traits<char>, CharAllocator> my_shared_string;
behaves exactly the same for the given problem; So does e.g.:
typedef std::vector<char, CharAllocator> my_shared_vector;
std::vector<char> v(my_shared_vector const& ss) {
return std::vector<char>(ss.begin(), ss.end());
}
Upvotes: 1
Reputation: 7
Changed according to comments from @T.C.
You may use this:
std::string s(my_basic_string.c_str(), my_basic_string.size());
Upvotes: 0
Reputation: 16670
As @T.C. has said, you should use:
std::string s(my_basic_string.data(), my_basic_string.size());
or
std::string s(my_basic_string.begin(), my_basic_string.end());
I prefer the second, but both will work.
Upvotes: 10