niX*_*man 12 c++ hash boost metaprogramming
我需要使用一个字符串作为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"
此算法的字符串?
谢谢你们.
使用gcc-4.6解决方案:
#include <iostream>
template<size_t N, size_t I=0>
struct hash_calc {
static constexpr size_t apply (const char (&s)[N]) {
return (hash_calc<N, I+1>::apply(s) ^ s[I]) * 16777619u;
};
};
template<size_t N>
struct hash_calc<N,N> {
static constexpr size_t apply (const char (&s)[N]) {
return 2166136261u;
};
};
template<size_t N>
constexpr size_t hash ( const char (&s)[N] ) {
return hash_calc<N>::apply(s);
}
int main() {
char a[] = "12345678";
std::cout << std::hex << hash(a) << std::endl;
std::cout << std::hex << hash("12345678") << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
http://liveworkspace.org/code/DPObf
我很高兴!
我不知道使用预处理器或模板的方法.我怀疑你最好的办法就是创建一个单独的预编译步骤(比如使用perl等)来hash_cstring
从一组源语句生成语句.然后,至少您不必在添加新字符串时手动拆分字符串,并且生成完全自动化且可重复.