C++ 如何使用(*mpORBextractorLeft)(im、cv::Mat()、mvKeys、MDDescriptor);

C++ 如何使用(*mpORBextractorLeft)(im、cv::Mat()、mvKeys、MDDescriptor);,c++,orb,C++,Orb,如何使用这种格式? (*名称)(参数1、参数2、参数3、参数4) 此代码属于orb_slam。。。。 指向非成员函数的指针声明具有以下结构: 返回类型(*名称)(参数列表) 因此,为了声明指向函数的指针func,将const char*和int作为参数,并返回bool,您说 void Frame::ExtractORB(int flag, const cv::Mat &im) { if(flag==0) (*mpORBextractorLeft)(im,cv::M

如何使用这种格式? (*名称)(参数1、参数2、参数3、参数4)

此代码属于orb_slam。。。。
指向非成员函数的指针声明具有以下结构:

返回类型(*名称)(参数列表)

因此,为了声明指向函数的指针
func
,将
const char*
int
作为参数,并返回
bool
,您说

void Frame::ExtractORB(int flag, const cv::Mat &im)
{
    if(flag==0)
        (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors);
    else
        (*mpORBextractorRight)(im,cv::Mat(),mvKeysRight,mDescriptorsRight);
}
请注意,您需要在
*func
周围加上括号,否则编译器会将其解释为函数声明

bool (*func)(const char*, int);
返回
bool*

现在假设你有一个函数

bool* func(const char*, int);
则可以通过以下方式使指针指向此函数

bool foo(const char* x, int y) { /* ... */ }
为了调用
func
所指向的函数,可以取消对指针的引用,并使用如下参数调用它

func = &foo;
这就是您在提供的示例中所做的。使用给定参数调用由
mpORBextractorLeft
(分别为
mpORBextractorRight
)指向的函数


一些进一步的说明:

  • 可以省略函数指针的解引用,因此

    bool result = (*func)("abc", 3);
    
    也应该有效

  • 声明指针时,可以立即对其进行初始化:

    bool result = func("abc", 3);
    
  • 如果需要多次写入指针类型,可以使用
    typedef
    简化代码:

    bool (*func)(const char*, int) = &foo;
    

它是指向一个函数的指针,您可以在示例代码中调用该函数。当你读了一点它的语法后,你可能想把你的问题的措辞变得尖锐一点。谢谢你的评论。我认为函数点可以将返回类型放在句子前面。可以省略void吗?
typedef bool (*fun_ptr)(const char*, int);
fun_ptr func1 = &foo;
fun_ptr func2 = &bar;