这可能是C ++模板吗?

时间:2013-11-22 20:41:58

标签: 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);
}

假设我想将函数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";
}

有没有办法定义一个函数“compute”而不重载函数但是使用模板代替?所以我可以传递一个具有任意数量参数的函数。

2 个答案:

答案 0 :(得分: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;

你可以这样称呼它:

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

答案 1 :(得分:2)

是的,有可能:您使用可变参数模板来推断参数的类型和数量,例如:

template <typename... T>
void compute(void (*func)(T...)) {
    func(/* magic goes here (see below) */);
    std::cout << sizeof...(T) << " arguments here\n";
}

棘手的业务是传递正确数量的参数所需的魔力。例如,通过生成一系列索引肯定是可行的。上面代码中遗漏的其他细节是T可以任意变化。如果您想将其锁定为double s序列,则可以使用合适的类型特征以及std::enable_if<cond, Type>static_assert()