我使用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子句中,我认为它返回函数指针。因此,我认为那些返回行为与主函数的返回类型不匹配。但令我惊讶的是,它运作良好。
您可以解释有关返回类型的此程序吗?
答案 0 :(得分:2)
func_map[problem]
会产生一个函数指针。在其上应用运算符()
,将调用该函数,并且表达式将生成int
。在调用之前取消引用函数指针是可选的。这是一个对称的可选地址,它带有一个函数名,用于初始化函数指针。
答案 1 :(得分:1)
确实
func_map[problem]
是一个指针。但是,您使用*:
取消引用指针 *(func_map[problem])
并通过添加()来调用函数:
(*(func_map[problem]))()
返回&#34; int&#34;。
答案 2 :(得分:0)
find返回一个迭代器;如果此迭代器结束,那么地图中不存在问题;因为它不是结束,所以它存在,然后在返回行中使用[]获得的指针函数来调用它。