地图中的不同键类型
Different key type in a map
对于特定要求,我想要一个包含不同类型键的映射。类似于 boost:any。 (我有一个旧的 gcc 版本)
map<any_type,string> aMap;
//in runtime :
aMap[1] = "aaa";
aMap["myKey"] = "bbb";
使用 boost 可以做到这一点吗?
提前致谢
如果你愿意使用boost::variant
:
#include <boost/variant.hpp>
#include <iostream>
#include <map>
using Key = boost::variant<int, std::string>;
using Map = std::map<Key, std::string>;
int main()
{
Map m;
m[1] = "aaa";
m["myKey"] = "bbb";
}
键 ordering/equation 自动存在。请注意,尽管 "1"
和 1
在这种方法中是 不同的 键。
如果您不愿意使用 boost 变体,您可以破解您自己的密钥类型。
您可以使用可区分的联合,或者使用低技术含量,只需使用一对 std::string
和 int:
#include <map>
#include <tuple>
#include <iostream>
struct Key : std::pair<int, std::string> {
using base = std::pair<int, std::string>;
Key(int i) : base(i, "") {}
Key(char const* s) : base(0, s) {}
Key(std::string const& s) : base(0, s) {}
operator int() const { return base::first; }
operator std::string() const { return base::second; }
friend bool operator< (Key const& a, Key const& b) { return std::tie(a.first, a.second) < std::tie(b.first, b.second); }
friend bool operator==(Key const& a, Key const& b) { return std::tie(a.first, a.second) == std::tie(b.first, b.second); }
friend std::ostream& operator<<(std::ostream& os, Key const& k) {
return os << "(" << k.first << ",'" << k.second << "')";
}
};
using Map = std::map<Key, std::string>;
int main()
{
Map m;
m[1] = "aaa";
m["myKey"] = "bbb";
for (auto& pair : m)
std::cout << pair.first << " -> " << pair.second << "\n";
}
打印:
(0,'myKey') -> bbb
(1,'') -> aaa
对于特定要求,我想要一个包含不同类型键的映射。类似于 boost:any。 (我有一个旧的 gcc 版本)
map<any_type,string> aMap;
//in runtime :
aMap[1] = "aaa";
aMap["myKey"] = "bbb";
使用 boost 可以做到这一点吗?
提前致谢
如果你愿意使用boost::variant
:
#include <boost/variant.hpp>
#include <iostream>
#include <map>
using Key = boost::variant<int, std::string>;
using Map = std::map<Key, std::string>;
int main()
{
Map m;
m[1] = "aaa";
m["myKey"] = "bbb";
}
键 ordering/equation 自动存在。请注意,尽管 "1"
和 1
在这种方法中是 不同的 键。
如果您不愿意使用 boost 变体,您可以破解您自己的密钥类型。
您可以使用可区分的联合,或者使用低技术含量,只需使用一对 std::string
和 int:
#include <map>
#include <tuple>
#include <iostream>
struct Key : std::pair<int, std::string> {
using base = std::pair<int, std::string>;
Key(int i) : base(i, "") {}
Key(char const* s) : base(0, s) {}
Key(std::string const& s) : base(0, s) {}
operator int() const { return base::first; }
operator std::string() const { return base::second; }
friend bool operator< (Key const& a, Key const& b) { return std::tie(a.first, a.second) < std::tie(b.first, b.second); }
friend bool operator==(Key const& a, Key const& b) { return std::tie(a.first, a.second) == std::tie(b.first, b.second); }
friend std::ostream& operator<<(std::ostream& os, Key const& k) {
return os << "(" << k.first << ",'" << k.second << "')";
}
};
using Map = std::map<Key, std::string>;
int main()
{
Map m;
m[1] = "aaa";
m["myKey"] = "bbb";
for (auto& pair : m)
std::cout << pair.first << " -> " << pair.second << "\n";
}
打印:
(0,'myKey') -> bbb
(1,'') -> aaa