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

How do I initialise a global map of string to function pointer?

本文关键字:初始化 函数 指针 映射 全局 字符串      更新时间:2023-10-16
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::p air<std::string,>

奇怪的是,当它在类中时,我能够正确初始化它,但是采用程序化的方式已经搞砸了。

如何初始化地图?

您可以使用构造函数直接初始化它:

#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 文件,则希望避免双重初始化全局变量。有关如何执行此操作的说明,请参阅此答案。