在编译时将字符串的字符相乘(在枚举中)
Multiply chars of a string at compile time (in enumeration)
当前我正在执行以下操作:
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。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 如何使用枚举将字符值映射到 int
- 为什么在枚举名称中的字符数量之前先枚举打字机
- 将C++枚举映射为常量字符*
- 可以将枚举的默认类型设置为无符号字符
- 将 #define 字符* 转换为枚举值
- 从字符到枚举分配错误值的static_cast
- 如何逐行枚举从文件中读取的文本,并找到 C 中字符和单词最多的行
- 在编译时将字符串的字符相乘(在枚举中)
- C++ 转换运算符重载、枚举、整数和字符