【问题标题】:How to pass other template parameter when template function uses parameter pack?模板函数使用参数包时如何传递其他模板参数?
【发布时间】:2019-11-05 12:25:12
【问题描述】:

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

我尝试了简单的求和函数。我想使用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;
}

【问题讨论】:

  • 您想为每个成员打印一些东西吗?还是只打印一次?
  • @StoryTeller-UnslanderMonica 没有。只有一次。我知道这是愚蠢的例子,但我试图让它变得简单。换句话说,我想进行参数扩展,除了第一个......或类似的东西。

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


【解决方案1】:

您会收到一个错误,因为唯一接受多个参数的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...);
}

【讨论】:

  • 谢谢。我会接受您的回答并尝试为模板类准备更复杂的示例。
  • @peter55555 无论示例多么复杂,StoryTeller 的建议都是有效的。复杂代码最好表示为单一用途组件的组合。
  • @RichardHodges 这个怎么样? stackoverflow.com/questions/58712888上面的方案可以用吗?
猜你喜欢
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多