【问题标题】:How do I do variadic templates of variadic arguments我如何做可变参数的可变参数模板
【发布时间】:2021-11-29 06:24:15
【问题描述】:

问题陈述

我正在尝试传递一个包含此类通用属性的结构

template <typename Value>
struct ColumnValue {
    std::string columnName;
    Value value;
};

我还想创建一个接受未知数量参数的函数

print(T... args)

这些 args 将是具有 1 个或多个的 ColumnValue 对象类型...

我希望打印函数根据“值”的类型来做不同的事情。

期望的结果

222
"hellooooo"

代码

#include <iostream>

template <typename Value>
struct ColumnValue {
    std::string columnName;
    Value value;
};

template <template<typename> typename ...X, typename ...Y>
void print(std::string firstArg, const X<Y>& ...args) {

    for(auto val : {args...}) {
        std::cout << val.value << std::endl;
    }
}

int main() {
    ColumnValue<int> v{
        .columnName="hello",
        .value=222
    };

    ColumnValue<std::string> d{
        .columnName="hello",
        .value="hellooooo"
    };

    print("", v, d);

    return 0;
}

错误信息

: 在'void print(std::string, const X& ...) [with X = {ColumnValue, ColumnValue}; Y = {int, std::__cxx11::basic_string, 标准::分配器 >};标准::字符串 = std::__cxx11::basic_string]’: :28:19: 需要来自 这里:12:5:错误:无法推断 来自‘{args#0, args#1}’的‘std::initializer_list&&’ 12 | for(自动验证:{args...}){ | ^~~ :12:5: 注意:推断参数“auto”的冲突类型(“ColumnValue”和 ‘列值>’)

【问题讨论】:

  • std::initializer_list 只能包含单一类型的元素。您可以使用折叠表达式:(std::cout &lt;&lt; ... &lt;&lt; args.value) &lt;&lt; std::endl;.
  • 我在加法auto只能是单一类型

标签: c++ templates variadic-templates


【解决方案1】:

ColumnValue 是一个模板这一事实对print 的签名没有任何影响。我们可以只取一个常规参数包,让编译器找出不同的类型。

其次,我们不能遍历参数包。但是,我们可以使用fold-expression

最终的结果应该是这样的

template <typename... T>
void print(std::string firstArg, const T& ...args) {
    (std::cout << ... << args.value) << std::endl;
}

如果你想在每个参数之间插入一个换行符,你需要某种帮助器。最简单的想法是。

template <typename T>
void print_helper(const T& arg) {
    std::cout << arg << '\n';
}

template <typename... T>
void print(std::string firstArg, const T& ...args) {

    (print_helper(args.value), ...);
}

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2023-03-07
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    相关资源
    最近更新 更多