如何在C++11中将参数的数组初始值设定项迁移到可变模板参数
How to migrate array-initializer of arguments to variardic template arguments in C++11
我有一些代码是在我们的平台上有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是行不通的。
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...(vars)
替换了sizeof(variants) / sizeof(variants[0])
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 视图中的参数推导失败:take_while
- 如何在新设计中迁移需要几个额外参数的函数
- 如何在C++11中将参数的数组初始值设定项迁移到可变模板参数
- QT5迁移和Boost:if.hp:宏参数不匹配错误
- 将项目从Visual Studio 2005迁移到2012 - System.参数nullexception,多个错误