当前位置: 首页 > 知识库问答 >
问题:

我如何做可变参数的可变模板

归翔
2023-03-14
template <typename Value>
struct ColumnValue {
    std::string columnName;
    Value value;
};

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

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;
}

共有1个答案

慕容渊
2023-03-14

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

其次,我们不能对参数包进行循环。然而,我们可以使用折叠表达式。

最终结果如下所示

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), ...);
}
 类似资料:
  • 5.7. 可变参数 参数数量可变的函数称为为可变参数函数。典型的例子就是fmt.Printf和类似函数。Printf首先接收一个的必备参数,之后接收任意个数的后续参数。 在声明可变参数函数时,需要在参数列表的最后一个参数类型之前加上省略符号“...”,这表示该函数会接收任意数量的该类型参数。 gopl.io/ch5/sum func sum(vals...int) int { total

  • 要解决的问题: 怎么创建一个拥有1个、2个或者更多的初始化器的类? 怎么避免创建一个实例而只拷贝部分的结果? 怎么创建一个元组? 最后的问题是关键所在:考虑一下元组!如果你能创建并且访问一般的元组,那么剩下的问题也将迎刃而解。 这里有一个例子(摘自“可变参数模板简述(A brief introduction to Variadic templates)”(参见参考)),要构建一个广义的、类型安全的

  • 当我编译时,我得到了这些错误:

  • 在第二章中,我们已经讲叙了基本的函数定义与调用方法,以及一些函数属性的作用。但 正如大多数编程语言一样,函数是如此普遍且重要的元素。因而本章继续讨论一些有关函 数的较为高级的用法。 5.1 可变参数 可变参数的意义 一般情况下,在定义函数时指定形参,在调用函数时传入实参,且参数个数必须要与定义 时指定的参数数量相等。但在一些情况下,我们将要实现的函数功能,它的参数个数可能 是不确定,或者有些参数是

  • 6. 可变参数 到目前为止我们只见过一个带有可变参数的函数printf: int printf(const char *format, ...); 以后还会见到更多这样的函数。现在我们实现一个简单的myprintf函数: 例 24.9. 用可变参数实现简单的printf函数 #include <stdio.h> #include <stdarg.h> void myprintf(const ch

  • 受这个答案的启发,我生成了这段代码,其输出取决于编译器: 如果使用 GCC 11 编译,调用