我希望用模板重构一些代码。我知道我可以使用宏轻松地完成它,但更喜欢模板/内联lambda。它应该在功能上等同。
代码如下:
static const Name AssetName = Name(TEXT("AssetName"));
AssetPtr = (AssetPtrType*)GetAssetFromName(AssetName);
if (!AssetPtr)
return false;
静态const等非常重要,要优化,因为这个函数可以调用一千次,并且有很多资源需要加载。那么如何概括?:
#define LOAD_ASSET(AssetName, AssetPtr, AssetPtrType)
LOAD_ASSET(CoolTexture, this->CoolTexture, Image)
LOAD_ASSET(CoolModel, this->CoolModel, Mesh)
我可以使用最新MSVC支持的任何C ++ 11/14 / etc函数。
答案 0 :(得分:0)
忽略你是否应该这样做的问题,我认为(几乎)字面翻译将是:
template<size_t CNT, class T>
void loadAsset(const char* AssetName, T*& AssetPtr) {
static const Name an = Name(TEXT(AssetName));
AssetPtr = (T*)GetAssetFromName(an);
if (!AssetPtr) {
throw SomeSensibleException{};
}
}
int foo()
{
try {
loadAsset<0>("CoolTexture", this->CoolTexture);
loadAsset<1>("CoolModel", this->CoolModel);
} catch (SomeSensibleException&) {
return false
}
}
问题是您需要为每个资产单独的模板函数实例化,而不仅仅是针对每种资产类型。否则,多个资产应共享相同的静态变量。现在,从我的头脑中,我无法想到 - 非宏 - 使用字符串文字的方式,作为模板和函数参数,这是额外计数器的原因。
如果foo在源文件中,您可能可以用__COUNTER__
替换手动计数,尽管我不确定它是否具有可移植语义。如果foo被编译为多个翻译单元,这将是危险的,因为__COUNTER__
可能具有不同的值,并且您将有一个odr违规。
如果您已经实际验证过,使用本地静态变量会使原始代码的性能显着提高,我宁愿坚持使用宏版本,至少在使用之前对模板版本进行概要分析。