Как передать другой параметр шаблона, когда функция шаблона использует пакет параметров? - PullRequest
1 голос
/ 05 ноября 2019

Можно ли иметь другой параметр шаблона, когда функция / класс использует пакет параметров?

Я пытаюсь использовать простую функцию суммирования. Я хочу напечатать что-нибудь, используя 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;
}

1 Ответ

5 голосов
/ 05 ноября 2019

Вы получаете ошибку, потому что единственная перегрузка 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...);
}
...