这可能是C++模板吗?

Win*_*ten 2 c++ templates overloading

我刚刚开始学习C++中的模板,并且不熟悉术语,但这就是我想要做的.假设我有三个功能.

double fa(double a)
{
   return a;
}

double fb(double a, double b)
{
   return (a+b);
}

double fc(double a, double b, double c)
{
   return (a+b+c);
}
Run Code Online (Sandbox Code Playgroud)

假设我想将函数fa,fb或fc传递给一个名为compute的新函数:

void compute(double (*func)(double))
{
   func(1);
   std::cout << "1 argument here";
}

void compute(double (*func)(double, double))
{
   func(1,2);
   std::cout << "2 arguments here";
}

void compute(double (*func)(double, double, double))
{
   func(1,2,3);
   std::cout << "3 arguments here";
}
Run Code Online (Sandbox Code Playgroud)

有没有办法定义一个函数"计算"而不重载函数,而是使用模板?所以我可以传递一个具有任意数量参数的函数.

Ben*_*igt 6

Ben(另一个Ben)已经建议你想要的是可变参数模板.

这是一个在可变数量的参数上添加的仿函数:

struct {
    double operator()(double first) const
    {
        return first;
    }

    double operator()(double first, double second) const
    {
        return first + second;
    }

    template<typename... T>
    double operator()(double first, double second, T... t) const
    {
        return (*this)(first + second, t...);
    }
} variadic_add;
Run Code Online (Sandbox Code Playgroud)

你可以这样称呼它:

template<typename Reducer>
void compute(Reducer reduce)
{
    reduce(1);
    std::cout << "1 arguments here";
    reduce(1,2);
    std::cout << "2 arguments here";
    reduce(1,2,3);
    std::cout << "3 arguments here";
    reduce(1,2,3,4);
    std::cout << "4 arguments here";
}

compute(variadic_add);
Run Code Online (Sandbox Code Playgroud)