C++ 如何用单个参数包装函数以接受多个参数?

C++ 如何用单个参数包装函数以接受多个参数?,c++,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 这主要是因为我有一个结构成员,它将存储一个指向函数的指针,

我需要一些代码,使我能够:

// 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,但在某些情况下它必须存储一个指向一元函数的指针,我并不真正想使用boost.variant


编辑:如果我没有说清楚的话,很抱歉,但它应该像一个转换器,可以为相同类型的无限一元函数工作。

由于您处于需要双x双->双函数的特定情况,您可以按如下方式包装foo:

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

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

由于您处于需要双x双->双函数的特定情况下,您可以按如下方式包装foo:

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

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

这里有两个通用解决方案

编译时 这可以使用可变模板完成:

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

template<typename... Ts>
double wrappedFunc(double x, const Ts&...)
{
    return f(x);
}
运行时 据我所知,您所做的编辑,您正在寻找一种在运行时执行此操作的方法。在C++14中,有一种方法可以做到这一点,即使用函数模板,返回参数数目可变的lambda,调用原始函数,传递其第一个参数,忽略其余参数:

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

这里有两个通用解决方案

编译时 这可以使用可变模板完成:

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

template<typename... Ts>
double wrappedFunc(double x, const Ts&...)
{
    return f(x);
}
运行时 据我所知,您所做的编辑,您正在寻找一种在运行时执行此操作的方法。在C++14中,有一种方法可以做到这一点,即使用函数模板,返回参数数目可变的lambda,调用原始函数,传递其第一个参数,忽略其余参数:

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

如果使用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

如果使用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

另一个简单的好方法是使用lambda

如果你有

double func (double a)
{
    return a;
}

struct st
{
    double(*foo)(double,double);
};
你能行

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

另一个简单的好方法是使用lambda

如果你有

double func (double a)
{
    return a;
}

struct st
{
    double(*foo)(double,double);
};
你能行

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

@当然是逸飞,因为如果它会,你叫它func1,2,它会做什么?它不能用两个参数调用foo。这就是为什么你可以使用省略号。。。假装多个参数,然后func1,2是很好的形式编辑似乎你误解了我想要的,但如果使用std::function,你的似乎可以工作,即参数的数量应该是最少的,因为我总是可以。。。做这个把戏。@YiFei当然,因为如果它会,你叫它func1,2,它会做什么?它不能用两个参数调用foo。这就是为什么你可以使用省略号。。。假装多个参数,然后func1,2是很好的形式编辑似乎你误解了我想要的,但如果使用std::function,你的似乎可以工作,即参数的数量应该是最少的,因为我总是可以。。。要做到这一点。似乎我不能在结构构造函数中初始化它,我必须在结构之外分配它吗?我在构造函数中没有遇到问题。也许可以举个代码示例?lambda仅在C++11 btwSeemed中可用。我无法在结构构造函数中初始化它,必须在结构之外分配它吗?我在构造函数中执行它没有问题。也许可以举个代码示例?lambda仅在C++11 b最终返回指针还是仅返回函数本身后才可用?@YiFei它返回lambda,它有自己独特的类型,不是函数指针。因为它是一个捕获lambda,据我所知,你不能将它转换为函数指针。它最终返回的是指针还是函数本身?@YiFei它返回一个lambda,它有自己独特的类型,不是函数指针。因为它是一个捕获lambda,所以据我所知,您不能将它转换为函数指针。