将具有不同数量参数的函数传递给另一个函数 C++
pass functions with different number of parameters to another function C++
想象一个函数 func1
,其参数是一个函数 f
及其参数。假设有两个函数 func2
和 func3
应该传递给 func1
,定义如下:
bool func2(int a, int b, float c){
// does something with arguments and returns the boolean result
}
bool func3(int a, int b, float c, float d){
// does something with arguments and returns the boolean result
}
请问如何定义func1
才能兼容这两个功能。当然有一个转折点,那就是将一个虚拟参数传递给 func2
但这不是一个好的解决方案。我已阅读 this post 但它似乎不是一个兼容的解决方案。有什么想法吗?
编辑:
此函数是一个 C++ 模板,相当于 python 函数,例如:
def func1(f, int a, int b, *args):
if f(a, b, *args):
# does something
我不是 100% 确定,但我相信您应该创建一个模板化函数。像这样。
template<typename T>
void func1 (T x, T y) {
//code
}
理论上,您应该能够用函数中的布尔值或任何其他值替换 x 和 y。本质上,您是在创建自己的自定义类型。
我在下面链接了一个参考。希望这有帮助。
https://en.cppreference.com/w/cpp/language/function_template
我更喜欢可读性更好的代码,即使增加了需要编写的行数。
func2
和 func3
的签名看起来或多或少相似。因此,您可以使 func2
接受另一个默认参数,如下所示
bool func2(int a, int b, float c, float d = 0){
// does something with arguments and returns the boolean result
}
bool func3(int a, int b, float c, float d){
// does something with arguments and returns the boolean result
}
现在声明一个函数指针并将其传递给func1
bool (*fp) (int a, int b, float c, float d);
void func1(fp *fp1);
请注意,C++ 并不喜欢函数指针
可变参数模板可以帮助您。最简单的版本:
template<class Fn, typename... Ts>
void func1(Fn fn, int a, int b, Ts... args) {
if (fn(a, b, args...))
...
}
func1(func2, 1, 2, 3);
func1(func3, 1, 2, 3, 4);
听起来你想要一个可变参数模板。这样的东西应该没问题(在移动设备上可能会出现语法错误)。
template<typename TCallback, typename TArgs...>
void Func1(TCallback Evt, TArgs... Args)
{
Evt(Args...);
}
void Func2(int Arg1, int Arg2) { }
Func1(Func2, 10, 100);
想象一个函数 func1
,其参数是一个函数 f
及其参数。假设有两个函数 func2
和 func3
应该传递给 func1
,定义如下:
bool func2(int a, int b, float c){
// does something with arguments and returns the boolean result
}
bool func3(int a, int b, float c, float d){
// does something with arguments and returns the boolean result
}
请问如何定义func1
才能兼容这两个功能。当然有一个转折点,那就是将一个虚拟参数传递给 func2
但这不是一个好的解决方案。我已阅读 this post 但它似乎不是一个兼容的解决方案。有什么想法吗?
编辑:
此函数是一个 C++ 模板,相当于 python 函数,例如:
def func1(f, int a, int b, *args):
if f(a, b, *args):
# does something
我不是 100% 确定,但我相信您应该创建一个模板化函数。像这样。
template<typename T>
void func1 (T x, T y) {
//code
}
理论上,您应该能够用函数中的布尔值或任何其他值替换 x 和 y。本质上,您是在创建自己的自定义类型。
我在下面链接了一个参考。希望这有帮助。
https://en.cppreference.com/w/cpp/language/function_template
我更喜欢可读性更好的代码,即使增加了需要编写的行数。
func2
和 func3
的签名看起来或多或少相似。因此,您可以使 func2
接受另一个默认参数,如下所示
bool func2(int a, int b, float c, float d = 0){
// does something with arguments and returns the boolean result
}
bool func3(int a, int b, float c, float d){
// does something with arguments and returns the boolean result
}
现在声明一个函数指针并将其传递给func1
bool (*fp) (int a, int b, float c, float d);
void func1(fp *fp1);
请注意,C++ 并不喜欢函数指针
可变参数模板可以帮助您。最简单的版本:
template<class Fn, typename... Ts>
void func1(Fn fn, int a, int b, Ts... args) {
if (fn(a, b, args...))
...
}
func1(func2, 1, 2, 3);
func1(func3, 1, 2, 3, 4);
听起来你想要一个可变参数模板。这样的东西应该没问题(在移动设备上可能会出现语法错误)。
template<typename TCallback, typename TArgs...>
void Func1(TCallback Evt, TArgs... Args)
{
Evt(Args...);
}
void Func2(int Arg1, int Arg2) { }
Func1(Func2, 10, 100);