目前我正在做以下事情:
enum TC_ID {
CMD01 = 'C'*'M'*'D'*'0'*'1',
CMD02 = 'C'*'M'*'D'*'0'*'2',
..
};
哪个有效,但对于许多命令来说都会非常费力:D
所以,我正在寻找一个宏,或内联函数或其他东西,它将char数组/字符串的所有字符与固定大小相乘,这样我就不必在我的代码中手动输入它们。
这样的事情可能吗?
一些不必要但可能有趣的信息:
嗯,这看起来有点愚蠢,为什么我这样做你可能会问;)
我的目标是在switch语句中使用这个enum,它最终用于为我的项目执行telecommands。
我的遥控器的大小总是5。 所以我正在计算一些非常简单的哈希值,它将在switch语句中使用:
char *id // contains the Telecommand as a string
TC_ID hash = static_cast<TC_ID>(id[0]*id[1]*id[2]*id[3]*id[4]);
switch (hash) {
case (CMD01):
// execute funtion..
break;
case (CMD02):
// do something else
break;
default:
// unknown command
}
我知道我可以使用很多if else语句和strcmp来代替开关,但我不想这样做因为它很难看:D
编辑:此外,使用适当的哈希函数会好得多。
但是,如何在枚举中实现这一点,以便我仍然可以将switch语句用于命令?
我认为我想要的基本上是某种哈希表,我可以在开始时为所有命令词生成,然后切换所有命令...但是如何?
EDIT2:我的编译器版本是C ++ 98
EDIT3:回答帖子中的评论解决方案
答案 0 :(得分:2)
这适用于(C ++ 11):
constexpr int multChars(const char* s /*string*/, int t = 1 /*tally*/){
return *s ? multChars(s+1, t*(*s)) : t;
};
//--------------------------------------------------------
//test it on a template (won't compile unless N is evaluated at compile time)
#include <iostream>
template<int N>
void printN() { std::cout<<N<<'\n'; }
int main(){
printN<multChars("ab")>();
return 0;
}
'a'的ascii代码是97,ascii代码'b'是98。 这会按预期返回9506。