std::unordered_map<std::string, std::string> mimeMap = {
#define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
#include "MimeTypes.inc"
};
文件MimeTypes.inc就像:
STR_PAIR("3dm", "x-world/x-3dmf"),
STR_PAIR("3dmf", "x-world/x-3dmf"),
STR_PAIR("a", "application/octet-stream"),
STR_PAIR("aab", "application/x-authorware-bin"),
STR_PAIR("aam", "application/x-authorware-map"),
STR_PAIR("aas", "application/x-authorware-seg"),
STR_PAIR("abc", "text/vnd.abc"),
STR_PAIR("acgi", "text/html"),
STR_PAIR("afl", "video/animaflex"),
STR_PAIR("ai", "application/postscript"),
STR_PAIR("aif", "audio/aiff"),
我很困惑。此代码如何初始化unordered_map
?
答案 0 :(得分:9)
#include
进行文字复制粘贴。这几乎就像你直接写了以下内容一样:
std::unordered_map<std::string, std::string> mimeMap = {
#define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
STR_PAIR("3dm", "x-world/x-3dmf"),
// ...
STR_PAIR("aif", "audio/aiff"),
};
现在,STR_PAIR
是一个预处理器宏,用std::pair<std::string, std::string>(K,V)
替换其参数,K
和V
是宏的参数。例如,上面的代码段与:
std::unordered_map<std::string, std::string> mimeMap = {
std::pair<std::string, std::string>("3dm", "x-world/x-3dmf"),
// ...
std::pair<std::string, std::string>("aif", "audio/aiff"),
};
如果您正在使用gcc或clang,则可以使用-E
命令行选项获取预处理输出并亲自查看。但请注意,它会很大。
最后,此类pair
用于复制初始化mimeMap
的元素。
此代码也有错误,因为map
的{{1}}为value_type
,因此pair<const Key, Value>
应该实际创建STR_PAIR
答案 1 :(得分:1)
从reference documentation您可以选择使用std::initializer_list
构造函数(5):
map( std::initializer_list<value_type> init, const Compare& comp = Compare(), const Allocator& alloc = Allocator() );
宏从std::pair
构建一个,#include
指令替换{}
大括号内的文本。最后,评估结果为:
std::unordered_map<std::string, std::string> mimeMap = {
#define STR_PAIR(K,V) std::pair<std::string, std::string>(K,V)
std::pair<std::string, std::string>("3dm", "x-world/x-3dmf"),
std::pair<std::string, std::string>("3dmf", "x-world/x-3dmf"),
std::pair<std::string, std::string>("a", "application/octet-stream"),
std::pair<std::string, std::string>("aab", "application/x-authorware-bin"),
std::pair<std::string, std::string>("aam", "application/x-authorware-map"),
std::pair<std::string, std::string>("aas", "a");
std::pair<std::string, std::string>(pplication/x-authorware-seg"),
std::pair<std::string, std::string>("abc", "text/vnd.abc"),
std::pair<std::string, std::string>("acgi", "text/html"),
std::pair<std::string, std::string>("afl", "video/animaflex"),
std::pair<std::string, std::string>("ai", "application/postscript"),
std::pair<std::string, std::string>("aif", "audio/aiff"),
};