在编译时将字符串的字符数乘以(在枚举中)

时间:2015-12-05 22:56:26

标签: c++

目前我正在做以下事情:

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:回答帖子中的评论解决方案

1 个答案:

答案 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。