为接受函数指针作为多种类型函数参数的函数创建模板函数
Create template function for function that accepts function pointers as parameters for many types of functions
我有几个 c 函数,除了一行中的函数外,它们做的事情几乎完全相同。我想用一个函数替换所有这些函数,我可以将其作为该行的函数指针传递:
Func1(type parameter);
Func2(type1 parameter1,type2 parameter2);
FuncFunc(FunctionPointer functionPointer){
funcVar;
...
functionPointer(funcVar,....);
...
}
int main(){
FuncFunc(Func1);
FuncFunc(Func2(,type2Object));
}
我能用 C++ 做到这一点吗?
不清楚您要实现的目标,但这里有一个示例,说明您的代码可以如何转换为有效的 C++。首先,让我们用参数的最大数量定义 Func
:
template<typename T1, typename T2>
void Func(T1 par1, T2 par2) {
std::cout << par1 << " " << par2 << std::endl;
}
然后我们应该让FuncFunc
接受你想要的任何功能:
template<typename ...T>
void FuncFunc(const std::function<void(T...)>& fPtr) {
std::string funcVar = "Foo!";
fPtr(funcVar);
}
或更易于使用的变体:
template<typename F>
void GuncFunc(const F& fPtr) {
std::string funcVar = "Foo!";
fPtr(funcVar);
}
最后使用 FuncFunc
:
auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1);
auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42);
FuncFunc(std::function<void(std::string)>(Func1));
FuncFunc(std::function<void(std::string)>(Func2));
return 0;
或GuncFunc
:
// Using std::bind
GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1));
GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42));
// Or using lambdas:
GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);});
GuncFunc([](std::string s){Func<std::string, int>(s, 42);});
选择 std::bind
或 lambda 似乎超出了您的问题范围,但您可能会发现一些有用的 here, there or in this 问题。
无论如何,您很可能需要 lambdas, std::function, std::bind or variadic templates。
我有几个 c 函数,除了一行中的函数外,它们做的事情几乎完全相同。我想用一个函数替换所有这些函数,我可以将其作为该行的函数指针传递:
Func1(type parameter);
Func2(type1 parameter1,type2 parameter2);
FuncFunc(FunctionPointer functionPointer){
funcVar;
...
functionPointer(funcVar,....);
...
}
int main(){
FuncFunc(Func1);
FuncFunc(Func2(,type2Object));
}
我能用 C++ 做到这一点吗?
不清楚您要实现的目标,但这里有一个示例,说明您的代码可以如何转换为有效的 C++。首先,让我们用参数的最大数量定义 Func
:
template<typename T1, typename T2>
void Func(T1 par1, T2 par2) {
std::cout << par1 << " " << par2 << std::endl;
}
然后我们应该让FuncFunc
接受你想要的任何功能:
template<typename ...T>
void FuncFunc(const std::function<void(T...)>& fPtr) {
std::string funcVar = "Foo!";
fPtr(funcVar);
}
或更易于使用的变体:
template<typename F>
void GuncFunc(const F& fPtr) {
std::string funcVar = "Foo!";
fPtr(funcVar);
}
最后使用 FuncFunc
:
auto Func1 = std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1);
auto Func2 = std::bind(Func<std::string, int>, std::placeholders::_1, 42);
FuncFunc(std::function<void(std::string)>(Func1));
FuncFunc(std::function<void(std::string)>(Func2));
return 0;
或GuncFunc
:
// Using std::bind
GuncFunc(std::bind(Func<float, std::string>, 3.14f, std::placeholders::_1));
GuncFunc(std::bind(Func<std::string, int>, std::placeholders::_1, 42));
// Or using lambdas:
GuncFunc([](std::string s){Func<float, std::string>(3.14f, s);});
GuncFunc([](std::string s){Func<std::string, int>(s, 42);});
选择 std::bind
或 lambda 似乎超出了您的问题范围,但您可能会发现一些有用的 here, there or in this 问题。
无论如何,您很可能需要 lambdas, std::function, std::bind or variadic templates。