我刚刚开始学习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”而不重载函数但是使用模板代替?所以我可以传递一个具有任意数量参数的函数。
答案 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()
。