gpt4 book ai didi

c++ - 我需要宏还是可以使用模板来执行此操作

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:35 25 4
gpt4 key购买 nike

我想用模板重构一些代码。我知道我可以使用宏轻松完成,但更喜欢模板/内联 lambda。它在功能上应该是等效的。

代码如下:

static const Name AssetName = Name(TEXT("AssetName")); 
AssetPtr = (AssetPtrType*)GetAssetFromName(AssetName);

if (!AssetPtr)
return false;

static const 等很重要,要优化,因为这个函数可以被调用一千次,而且有很多 Assets 要加载。那么我该如何概括呢?:

#define LOAD_ASSET(AssetName, AssetPtr, AssetPtrType)

LOAD_ASSET(CoolTexture, this->CoolTexture, Image)
LOAD_ASSET(CoolModel, this->CoolModel, Mesh)

我可以使用最新 MSVC 支持的任何 C++11/14/etc 函数。

最佳答案

忽略你是否应该这样做的问题,我认为(几乎)字面翻译是:

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
}
}

问题是您需要为每个 Assets 创建一个单独的模板函数实例化,而不仅仅是每个 Assets 类型。否则多个 Assets 应该共享同一个静态变量。现在,从我的脑海中,我想不出一种非宏的方式来同时使用字符串文字作为模板和函数参数,这就是额外计数器的原因。

如果 foo 在源文件中,您可以用 __COUNTER__ 替换手动计数,尽管我不确定它是否具有可移植语义。如果 foo 被编译为多个翻译单元,这将是危险的,因为 __COUNTER__ 可能具有不同的值,并且您将违反 odr。

如果您确实已经证实,使用局部静态变量可以显着提高原始代码的性能,我宁愿坚持使用宏版本,并且至少在使用模板版本之前对其进行概要分析。

关于c++ - 我需要宏还是可以使用模板来执行此操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36639556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com