我有一些代码是在我们的平台上安装c ++ 11编译器之前编写的。最后,我们可以开始使用c ++ 11功能,因为最后一个平台终于赶上了。因此,我正在尝试使用变量模板清理一些长的“具有N个参数的函数,通过复制粘贴”链。但是,我承认我不太清楚如何解决以下情况。我有一个Format()方法,它将参数打包到变体中,然后将它们传递给隐藏在源文件中的函数(以减少膨胀,包括依赖性等)。如何将模板参数解压缩到数组中以传递给方法?
struct Variant
{
enum ValueType { Integer, Float };
Variant(int _value) { value._asInt = _value; valueType = Integer}
// ... and other constructors
union Value
{
int _asInt;
// ... other types including specific user types
} value;
ValueType valueType;
};
// Implementation burried in source file
extern size_t FormatStringImpl(const char* format, char * dest, size_t capacity, Variant variants[], size_t numVariants);
template<class T0>
size_t Format(const char* format, char* dest, size_t capacity, T0 var0)
{
Variant variants[] = { Variant(var0) };
return FormatStringImpl(format, dest, capacity, variants, sizeof(variants) / sizeof(variants[0]));
}
template<class T0, class T1>
size_t Format(const char* format, char* dest, size_t capacity, T0 var0, T1 var1)
{
Variant variants[] = { Variant(var0), Variant(var1) };
return FormatStringImpl(format, dest, capacity, variants, sizeof(variants) / sizeof(variants[0]));
}
// and on and on
void foo()
{
const size_t length = 1024;
char output[length];
Format("Values are {0}, {1}, {2}", output, length, 10, 20, 30);
}
细节稍微复杂一些,但它的要点是捕获类型/数据并将其拉入源文件进行处理的方法。我想在堆栈上执行所有分配,因此在解压缩循环中使用std :: vector将不起作用。
答案 0 :(得分:2)
Format
可以简化为:
template<class ... Ts>
size_t Format(const char* format, char* dest, size_t capacity, Ts... vars)
{
Variant variants[] = { Variant(vars)... };
return FormatStringImpl(format, dest, capacity, variants, sizeof...(vars));
}
我还将sizeof(variants) / sizeof(variants[0])
替换为sizeof...(vars)