我在几个不同的地方读过,使用C++ 11的新字符串文字,可以在编译时计算字符串的哈希值.然而,似乎没有人准备出来说它将是可能的或如何完成.
我特别感兴趣的是这样的用例.
void foo( const std::string& value )
{
switch( std::hash(value) )
{
case "one"_hash: one(); break;
case "two"_hash: two(); break;
/*many more cases*/
default: other(); break;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:编译时哈希函数不必像我编写的那样完全.我尽力猜测最终解决方案的样子,但meta_hash<"string"_meta>::value也可能是一个可行的解决方案.
有没有办法在编译时使用C/C++预处理器(甚至模板元编程)创建字符串的哈希?
例如 UNIQUE_SALT("HelloWord", 3DES);
想法是HelloWorld不会出现在已编译的二进制文件中,只是一个哈希.
编辑:这些声明中有许多分布在大型代码库中.
我需要使用一个字符串作为ID来获取一些对象.在运行时实现这一点,并且运行良好.但由于显而易见的原因,这使得静态类型检查变得不可能.
我用Google搜索了在编译时计算字符串的哈希和的算法:使用Boost.MPL进行C++编译时字符串哈希.
它似乎是我的问题的完美解决方案,除了算法所必需的sring应该被分成4个字符或逐个字符,显而易见的原因.
即,而不是通常的ID的当前记录,我将不得不这样写:
hash_cstring<boost::mpl::string<'obje', 'ct.m', 'etho', 'd'>>::value
Run Code Online (Sandbox Code Playgroud)
这绝对无法使用.
问题是,如何正确传递诸如"object.method"此算法的字符串?
谢谢你们.