【发布时间】:2015-06-30 23:59:35
【问题描述】:
是否可以在编译时执行唯一字符串到 int 的映射? 假设我有一个这样的模板用于分析:
template <int profilingID>
class Profile{
public:
Profile(){ /* start timer */ }
~Profile(){ /* stop timer */ }
};
我把它放在函数调用的开头,如下所示:
void myFunction(){
Profile<0> profile_me;
/* some computations here */
}
现在我正在尝试执行以下操作,which is not possible since string literals cannot be used as a template argument:
void myFunction(){
Profile<"myFunction"> profile_me; // or PROFILE("myFunction")
/* some computations here */
}
我可以声明全局变量来解决这个问题,但我认为避免以前的声明会更优雅。表单的简单映射
- “我的功能”→0
- “myFunction1”→1
- …
- “myFunctionN”→N
就足够了。但到目前为止,无论是使用 constexpr、模板元编程还是宏,我都找不到完成这种映射的方法。有什么想法吗?
【问题讨论】:
-
您可能会使用预处理器技巧,或者在构建时生成一些(例如 C++ 头文件)文件。
-
构建时生成秒。
-
我真的不明白你为什么要在这里使用模板开始。与其为每个要分析的函数创建一个类,不如创建一个实例,将分析 ID 名称作为构造函数参数传入?或者还有其他一些模板参数/特化吗?
-
enum不够映射吗?类似:enum { myFunction, myFunction1, ..., myFunctionN };。您可以将其用作模板参数——甚至不必双引号 :) -
如果字符串都像
myFunctionN这样简单,只需去掉myFunction部分并将剩余的转换为int
标签: c++