Нет, тебе это не нужно.Быстрое статическое утверждение обнаруживает, что тип менеджера сегментов по умолчанию тот же:
static_assert(std::is_same<
bip::managed_shared_memory::segment_manager,
bip::managed_mapped_file::segment_manager>{}, "incompatible segments");
Итак, вы можете просто использовать один:
using SegmentManager = bip::managed_shared_memory::segment_manager;
Демо
Live On Coliru
#include <iostream>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/managed_mapped_file.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
namespace bip = boost::interprocess;
static_assert(std::is_same<
bip::managed_shared_memory::segment_manager,
bip::managed_mapped_file::segment_manager>{}, "incompatible segments");
using SegmentManager = bip::managed_shared_memory::segment_manager;
struct X {
int i = 0;
};
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
namespace bmi = boost::multi_index;
using Table = bmi::multi_index_container<X,
bmi::indexed_by< bmi::ordered_unique< bmi::tag<struct byI>, bmi::member<X, int, &X::i> > >,
bip::allocator<X, SegmentManager>
>;
void dump(Table const& t) {
std::cout << "table: ";
for(auto& x : t)
std::cout << x.i << "; ";
std::cout << std::endl;
}
void run_test(Table& table) {
dump(table);
if (table.empty()) {
table.insert({{1}, {2}, {3}, {4}});
} else {
table.insert({5});
}
dump(table);
table.erase(table.begin());
dump(table);
}
int main() {
{
bip::managed_shared_memory segment(bip::open_or_create, "msm", 10ul<<20);
run_test(*segment.template find_or_construct<Table>("name")(segment.get_segment_manager()));
}
{
bip::managed_mapped_file segment(bip::open_or_create, "mmf", 10ul<<20);
run_test(*segment.template find_or_construct<Table>("name")(segment.get_segment_manager()));
}
}
Печать (в моей системе), например:
table: 2; 3; 4;
table: 2; 3; 4; 5;
table: 3; 4; 5;
table: 2; 3; 4;
table: 2; 3; 4; 5;
table: 3; 4; 5;