【发布时间】:2014-03-29 16:18:12
【问题描述】:
在C++ 中,可以通过以下方式在编译时生成整数到变量值的常量时间查找:
template<int>
int *map() {
static int var = 0;
return &var;
}
int main() {
*map<0>() = 42;
*map<1>() = 1337;
return *map<0>(); //returns 42
}
请注意,编译器将为在编译时使用的每个“键”创建一个全局变量 map<key>::var。
是否可以创建一个使用字符文字作为“键”的类似映射函数?请注意,由于它们的本地链接,字符文字不能用作模板参数。
我需要能够在我的代码的任何部分指定新键,事实上,作为任何表达式的一部分。请注意,在我的整数示例中,我如何指定 map<0> 应仅存在于 main() 中。
注意:特别是,我想使用 __FILE__, __LINE__ 的元组作为键,通过在 var 前加上 thread_local 使映射线程特定,并通过在 map() 前加上 @ 使翻译单元特定987654332@。因此,理论上,字符文字的本地链接不会造成问题。整个事情是对记录器的性能优化,它允许为特定文件的部分指定日志级别。
【问题讨论】:
-
constexpr不会为此工作吗? (除非您需要在运行时设置地图的条目。) -
看起来有点像 XY 问题。你能解释一下你真正想要做什么吗?
-
也许把你的字符文字转换成mpl::string这样的类型。
-
我想不惜一切代价避免提升。此外,由于我想使用
__FILE__,它需要使用字符串文字。除此之外,如果可能的话,我还想避免在我的符号中使用无穷无尽的整数列表。还有,哇。这 15 行测试代码只用了 4 秒就在 g++ 中构建。
标签: c++ templates c++11 template-meta-programming