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

Multiply chars of a string at compile time (in enumeration)

本文关键字:枚举 字符 编译 字符串      更新时间:2023-10-16

当前我正在执行以下操作:

enum TC_ID {
   CMD01 = 'C'*'M'*'D'*'0'*'1',
   CMD02 = 'C'*'M'*'D'*'0'*'2',
   ..
};

这是有效的,但对于许多命令来说将是相当费力的:D

因此,我正在寻找一个宏、内联函数或其他东西,它可以将字符数组/字符串的所有字符乘以固定大小,这样我就不必在代码中手动键入它们。

这样的事情可能发生吗?


一些不必要但可能有趣的信息:

嗯,这看起来有点愚蠢,你可能会问我为什么要这么做;)

我的目标是在switch语句中使用这个枚举,它最终用于为我的项目执行远程通信。

我的远程办公空间总是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

EDIT:另外,使用适当的散列函数会更好。

然而,如何在枚举中实现这一点,以便我仍然可以使用命令的switch语句?

我想我想要的基本上是某种哈希表,我可以在开始时为所有命令字生成哈希表,然后对所有命令字进行切换。。但是怎么做呢?

编辑2:我的编译器版本是C++98

第3版:回复文章评论中的解决方案

这是有效的(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,"b"的ascii代码是98。这将按预期返回9506。