我正在制作一个实现Symbol
类的C ++应用程序(类似于XLib中的Atom
或ruby中的:symbols
),该类实际上将一个字符串映射为查找表中的字符串整数值。
这意味着初始化 Symbol
是使用一个花费大量时间,每次创建一个查找表都进行搜索的唯一部分。
通常这只是必要的邪恶,但是这样做会很痛苦:
void someRepeatedlyCalledFunction () {
doThingWithSymbol(Symbol("HardCodedSymbolString"));
}
这意味着每次我调用此函数时,整个符号查找都会再次发生。
当然,可以通过以下方式避免这种情况:
Symbol _HardCodedSymbolString;
void someRepeatedlyCalledFunction () {
if (!_HardCodedSymbolString.isSet())
_HardCodedSymbolString = Symbol("HardCodedSymbolString");
doThingWithSymbol(_HardCodedSymbolString);
}
但这是经常要做的没有吸引力的事情,因此理想情况下,它可以隐藏在宏_SYMBOL(name)
或类似的东西后面。问题在于,由于将从内部函数中调用此宏,因此无法为该符号定义全局变量。
或者,如果在 compile-time 时将硬编码的符号值添加到列表中,甚至会更 ,因此将正确的符号值像常量一样放入-但我认为如果不编写某种自定义预处理程序步骤就无法做到这一点。
是否有实现这些解决方案的方法,或者是更好的解决方案?
答案 0 :(得分:-3)
您可以将变量设为静态吗?
void someRepeatedlyCalledFunction () {
static Symbol _HardCodedSymbolString;
if (!_HardCodedSymbolString.isSet())
_HardCodedSymbolString = Symbol("HardCodedSymbolString");
doThingWithSymbol(_HardCodedSymbolString);
}
或者,如果将硬编码的符号值设置为 在编译时添加到列表中,因此放置了正确的符号值 像常量一样-但我认为没有编写就无法做到这一点 某种自定义预处理器步骤。
应该足够容易编写快速的代码生成器(使用您喜欢的任何语言)