返回值时的函数指针

时间:2016-07-27 18:19:49

标签: c++

我使用C语言升级我的编码技能。

我设计了一个简单的程序,因为我想轻松找到我所寻找的问题,并在处理许多问题时安排工作,如下所示。

这是我的头文件

#pragma once
#ifndef PROBLEM_H
#define PROBLEM_H

namespace PROBLEM_1 { int do_main(); }

typedef int(*MAINFUNC)();

#endif 

以下是我的源文件。

#include "problems.h"
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;

typedef int(*MAINFUNC)(void);

map<string, MAINFUNC> func_map;

void initialize_problem_map(void) {
    func_map["problem_1"] = PROBLEM_1::do_main;
}

namespace PROBLEM_1 {
    int do_main(void) {
        cout << "hi" << endl;
        return 1;
    }
}

int main(void) {
    string problem;

    initialize_problem_map();
    cin >> problem;

    if (func_map.find(problem) != func_map.end())
        return (*(func_map[problem]))();


    return -1;  
}

如果我输入&#34; PROBLEM_1&#34;然后,将执行命名空间PROBLEM_1中的do_main函数。我认为这种设计可以帮助我组织多个编码问题。

但是,我的问题是关于以下两个代码行。

if (func_map.find(problem) != func_map.end())
    return (*(func_map[problem]))();

正如您所看到的,主要功能的返回类型是&#34; int&#34;。但是,在if子句中,我认为它返回函数指针。因此,我认为那些返回行为与主函数的返回类型不匹配。但令我惊讶的是,它运作良好。

您可以解释有关返回类型的此程序吗?

3 个答案:

答案 0 :(得分:2)

实际上,

func_map[problem]会产生一个函数指针。在其上应用运算符(),将调用该函数,并且表达式将生成int。在调用之前取消引用函数指针是可选的。这是一个对称的可选地址,它带有一个函数名,用于初始化函数指针。

答案 1 :(得分:1)

确实

 func_map[problem] 

是一个指针。但是,您使用*:

取消引用指针
 *(func_map[problem])

并通过添加()来调用函数:

 (*(func_map[problem]))()

返回&#34; int&#34;。

答案 2 :(得分:0)

find返回一个迭代器;如果此迭代器结束,那么地图中不存在问题;因为它不是结束,所以它存在,然后在返回行中使用[]获得的指针函数来调用它。