我想要一些能让我这样做的代码:
// 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)。
编辑:很抱歉,如果我没有说清楚,但它应该(某种程度上像转换器)适用于同类的无限一元功能
答案 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);};