c++ - 模板函数使用参数包时如何传递其他模板参数?

标签 c++ templates c++14 metaprogramming variadic-templates

函数/类使用参数包时是否可以有其他模板参数?

我尝试简单的求和函数。我想使用 template Printer 类打印一些东西。怎么做?如何告诉编译器特别“标记”第一个参数......或者有一些解决方法。

下面的代码会产生错误。

#include <iostream>

template <typename T>
double sum(T t)
{
    return t;
}

template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
    printer.print();

    return t + sum(rest...);
}

struct P
{
    void print() { std::cout << "= " << std::endl; }
};

int main()
{
    P printer;
    std::cout << sum(printer, 2, 3, 4.1) << std::endl;
    return 0;
}

最佳答案

你得到一个错误,因为唯一接受多个参数的 sum 重载期望第一个参数是打印机对象。由于您只想打印一次,因此最简洁的方法是将求和完全分离到它自己的函数中:

template <typename T>
double sum_impl(T t)
{
    return t;
}

template <typename T, typename... Rest>
double sum_impl(T t, Rest... rest)
{
    return t + sum(rest...);
}

然后在 sum

中使用它
template <typename Printer, typename T, typename... Rest>
double sum(Printer printer, T t, Rest... rest)
{
    printer.print();

    return sum_impl(t, rest...);
}

关于c++ - 模板函数使用参数包时如何传递其他模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58711332/

相关文章:

c++ - 指针变量有什么作用?

c++ - 如何编写没有参数包的可变参数函数?

c++ - 将可变数量的参数传递给嵌入式 Python API

c++ - 无法使用 std::map::emplace 插入没有复制构造函数的类的对象

c++ - 为什么我不能使用 __declspec(dllexport) 从 COM DLL 导出 DllGetClassObject()?

c++ - 为什么我必须将地址转换为整数才能使其可分配?

c++ - 将汇编代码移植到 C++

PHP 正则表达式搜索包含,然后在找到它们的地方写入包含

c++ - 由于内联函数,C++ 中是否出现 "code bloat"?

c++ - 使用只有一名成员的 union 的目的是什么?