如果我有静态map<K, V> m{{"m1", 1}, {"m2", 2}, ...},这是将它转换map<V, K>为相同对的最简单方法,但现在值转到键,键是值?
我希望在类初始化代码中有这个.像那样:
class PseudoEnum{
enum Enum{m1, m2, m3};
static map<string, Enum> _strMapping = {{"m1", Enum::m1}, {"m2", Enum::m2}, ...};
static map<Enum, string> _enumMapping = ??? // shortest possible init
}
Run Code Online (Sandbox Code Playgroud)
std::transform(m.cbegin(), m.cend(), std::inserter(other, other.begin()),
[](auto const& p){
return std::make_pair(p.second, p.first);
});
Run Code Online (Sandbox Code Playgroud)
这应该足够了.你可以将它包装在一个函数中:
template<typename K, typename V>
auto invert_mapping(std::map<K,V> const& m)
{
std::map<V,K> other;
std::transform(m.cbegin(), m.cend(), std::inserter(other, other.begin()),
[](auto const& p){
return std::make_pair(p.second, p.first);
});
return other;
}
Run Code Online (Sandbox Code Playgroud)
然后你会打电话
static map<Enum, string> _enumMapping = invert_mapping(_strMapping);
Run Code Online (Sandbox Code Playgroud)
如果要在原位初始化它,可以使用Boost的转换迭代器:
auto tr = [](auto const& p){ return std::make_pair(p.second, p.first); };
std::map<Enum, std::string> _enumMapping(
boost::make_transform_iterator(_strMapping.cbegin(), tr),
boost::make_transform_iterator(_strMapping.cend(), tr)
);
Run Code Online (Sandbox Code Playgroud)