c++ - 如何将参数的数组初始值设定项迁移到 C++11 中的可变模板参数

标签 c++ c++11 templates variadic-templates template-meta-programming

我有一些代码是在我们的平台上使用 c++11 编译器之前编写的。最后一个平台终于 catch 了,我们终于可以开始使用 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 是行不通的。

最佳答案

格式可以简化为:

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)

关于c++ - 如何将参数的数组初始值设定项迁移到 C++11 中的可变模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34361185/

相关文章:

c++ - std::call_once 是阻塞调用吗?

c++ - 使用 typedef 类型作为类模板参数

不同类类型节点的 C++ 树/森林结构

带有字符串和 int 参数的 C++ 编译器错误

c++ - 减少编译时间的奇怪 C++ 模式

listing_6_6.cpp 中的 c++ 编译错误来自 C++ Concurrency In Action 一书

c++ - 为什么 GCC 允许通过右值引用捕获?

c++ - 使用 CRTP 时 clang++ 不接受使用模板模板参数

c++ - g++ 链接器顺序问题

c++ - 应用于多个参数的 STL 算法,例如 for_each