我需要一个宏,还是可以使用模板执行此操作

时间:2016-04-15 06:16:59

标签: c++ templates c++11 macros

我希望用模板重构一些代码。我知道我可以使用宏轻松地完成它,但更喜欢模板/内联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函数。

1 个答案:

答案 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违规。

如果您已经实际验证过,使用本地静态变量会使原始代码的性能显着提高,我宁愿坚持使用宏版本,至少在使用之前对模板版本进行概要分析。