如何用单个参数包装函数来接受多个参数?

时间:2016-06-15 15:23:33

标签: c++

我想要一些能让我这样做的代码:

// Dummy function foo
double foo(double a){return a+1;}
// Some wrapping here ... which generates (maybe a pointer to)
double Foo(double a, ...){return a+1;}
// i.e. ignore any other arguments, just accept

这主要是因为我有一个结构成员,它将存储一个指向函数的指针,通常说double (*)(double, double),但有些情况下它必须存储一个指向一元函数的指针(我不会&#39) ; t真的想使用boost.variant)。

编辑:很抱歉,如果我没有说清楚,但它应该(某种程度上像转换器)适用于同类的无限一元功能

4 个答案:

答案 0 :(得分:4)

由于您处于需要double x double -> double功能的特定情况,您可以按如下方式包裹foo

double foo_w(double a, double) { return foo(a); }

如果您对更通用的解决方案感兴趣,可以查看可变参数模板中的参数数量(及其各自的类型),如Mohammadreza Panahi在其答案中所示。但尽量不要过度设计你的问题。 ; - )

答案 1 :(得分:4)

以下是两种通用解决方案。

编译时间

这可以使用可变参数模板来完成:

double func(double x)
{
    return x + 1;
}

template<typename... Ts>
double wrappedFunc(double x, const Ts&...)
{
    return f(x);
}
可以使用任意类型的任意数量的参数调用

wrappedFunc(),只会实际使用第一个参数并将其传递给f()

wrappedFunc(5.0, "Hello!", false, -23);    // returns 6.0

运行时间

据我了解您所做的编辑,您正在寻找一种在运行时执行此操作的方法。这是在C ++ 14中使用函数模板的一种方法,返回一个带有可变数量参数的lambda,它调用原始函数,传递第一个参数并忽略其余参数:

template<typename Func>
auto getVariadicWrapper(Func func)
{   
    return [func](auto argument, auto...) {return func(argument);};
}

此函数模板可用于以下列方式构造包装函数:

// Assuming func() is the same as before

// Create a wrapper function, which passes its first param to func and ignores the rest.
auto wrappedFunc = getVariadicWrapper(func);

// Use it
wrappedFunc(5.0, false, "bananas", 72233);    // returns 6.0

答案 2 :(得分:4)

如果您使用C ++ 11,而不是函数指针,则可以使用std::function来存储函数:

double foo(double, double) {}
double Foo(double, ...) {} //You could also use a template for this one

//Note that the number of parameters of 'func' should be the maximum possible
//arguments of the functions you want to store (here: 1 vs 2)
std::function<double(double, double)> func;

func = foo; //Ok
func = Foo; //Ok

//Now you can call 'func'
func(1, 2); //if 'func' == 'Foo', ignores the 2

答案 3 :(得分:0)

另一种简单易用的方法是使用lambda

如果你有

double func (double a)
{
    return a;
}

struct st
{
    double(*foo)(double,double);
};

你可以做到

st a;
a.foo = [](double a,double b){return func(a);};