C++ 函数指针的澄清

C++ 函数指针的澄清,c++,function,function-pointers,C++,Function,Function Pointers,call_a和call_b的定义如下: int function_a () { int ret_a = call_a; int ret_b = call_b; } typedef void Subroutine(); //The signature of the function you want to call through pointer int call_generic(Subroutine *subroutine) { //10 lines soubrouti

call_a和call_b的定义如下:

int function_a () {
   int ret_a = call_a;
   int ret_b = call_b;
}
typedef void Subroutine();  //The signature of the function you want to call through pointer

int call_generic(Subroutine *subroutine)
{
  //10 lines
  soubroutine();
}
函数call_a和call_b之间的唯一区别是它们调用的函数不同。我知道函数指针是这种情况下最好的方法。生成一个函数(只调用_a,而不是调用_a和调用_b),并将函数指针传递给其中的调用_c和调用_d。我们如何才能做到这一点

希望我足够清楚,让你明白

我们如何才能做到这一点


我知道函数指针是这种情况下最好的方法

有时候,事实并非如此。根据您的实际用例,使用lambdas可能更有意义

void call_c();
void call_d();

int call_a(void (*c)()) {
  // Some 10 lines
  c();
}

int function_a () {
   int ret_a = call_a(&call_c);
   int ret_b = call_a(&call_d);
}
模板
int call_a(可调用c){
//大约10行
c();
}
int函数_a(){
int ret_a=call_a([](){call_c();});
int ret_b=call_a([](){call_d();});
}

您可能在找这个吗

template <typename Callable>
int call_a(Callable c) {
  // Some 10 lines
  c();
}

int function_a () {
   int ret_a = call_a([]() { call_c(); });
   int ret_b = call_a([]() { call_d(); });
}
可以这样称呼:

int function_a () {
   int ret_a = call_a;
   int ret_b = call_b;
}
typedef void Subroutine();  //The signature of the function you want to call through pointer

int call_generic(Subroutine *subroutine)
{
  //10 lines
  soubroutine();
}

您不需要函数指针。只需传递某种标志(BoOL,EnUM等),以确定是否使用“C++ > CaluxC.<代码>或<代码> CalrasdD<代码>。你的问题是什么?@Angew:不,它要求在每个需要它的翻译单元中精确地执行一次
call_a
。是的,没错。实际上,它被转换为在头文件中实现(将注释从“头文件”更正为“头文件”)。@Angew:No,不一定。头文件通常是任何扩展名为
.h
的文件,但通常我们在扩展名为
.ipp
或类似文件中编写模板函数定义,以将它们与头文件区分开来。谁是“我们?”对我来说,任何获得
\include
d而不是直接编译的文件都是头文件。但是好的,我会更改它:这需要在
\include
d文件中实现
call\u a
。@Angew:同样,不,它没有。您似乎认为文件名
*.h
#include
机制比它们应得的权力更大。“我们”指的是C++程序员的大多数,编写规范的C++代码。