如何初始化字符串到函数指针的全局映射?

时间:2019-04-09 23:13:24

标签: c++

template <typename T>
void draw_rectangle() {
    display();
    glRecti(10, 10, curr_obj_to_draw<T>->get_length() + 10, curr_obj_to_draw<T>->get_breadth() + 10);
}

std::map<std::string, void (*)()> str_to_fp_mapping;

void initialise_map(){
    str_to_fp_mapping = {std::pair<std::string, void (*)()>("rectangle", &draw_rectangle)};
}

错误:

  

没有匹配的std :: pair 构造函数

奇怪的是,当我将它放在类中时,我能够正确地对其进行初始化,但是以过程方式进行放置会使它搞砸了。

如何初始化地图?

1 个答案:

答案 0 :(得分:1)

您可以使用构造函数直接对其进行初始化:

#include <map>

void draw_rectangle() {
    // ...
}
void draw_circle() {
    // ...
}
void draw_mona_lisa() {
    // .....
}
// templated function
template<class T>
void draw_type() {
    //... 
}

std::map<std::string, void (*)()> str_to_fp_mapping {
    {"draw rectangle", draw_rectangle },
    {"draw circle", draw_circle },
    {"draw mona lisa", draw_mona_lisa },
    {"draw string", draw_type<std::string> } // Template example   
}; 

如果执行此操作,则不必调用initialize函数,因为该函数在调用main之前就已初始化。如果您输入:

std::map<std::string, void (*)()> str_to_fp_mapping{}; 

这也将其初始化,但会将其初始化为一个空映射。

避免在更复杂的程序中进行双重初始化

如果将程序分为几个静态链接的cpp文件,则要避免对全局变量进行两次初始化。有关如何执行此操作的说明,请参见this answer