微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何初始化指向在映射中用作值的类中的函数的指针?

如何解决如何初始化指向在映射中用作值的类中的函数的指针?

我正在编写一个程序,其行为由用户定义的设置控制,通过包含关键字和值的普通 ASCII 配置文件提供。 由于并非所有关键字都由用户提供,因此也有“内置”设置。 为不同关键字提供的配置值将影响变量(设置类的所有部分),而这些变量又将决定程序的行为。 要将配置值转换为这些变量,我想使用解析函数 - 每个配置关键字一个

为了实现这一点,我使用了一个映射,一个配置关键字作为键,一个 param_struct 对象作为一个值。 param_struct 包含配置关键字的认值、从配置文件读取的值(可能为空)以及指向解析函数的指针。

作为第一步,我试图初始化认值,但我不断收到编译错误。我在这里做错了什么吗?

settings.cpp: In member function 'std::map<std::__cxx11::basic_string<char>,param_struct> settings::create_builtin_config()':
settings.cpp:84:96: error: no matching function for call to 'param_struct::param_struct(const char [6],const char [1],<unresolved overloaded function type>)'
   84 |     map<string,param_struct> builtin_config = {{"MY_CONfig_KEYWORD",param_struct("XYZZY","",update_log)}}; //
      |                                                                                                ^
settings.cpp:84:98: error: Could not convert '{{"MY_CONfig_KEYWORD",<expression error>}}' from '<brace-enclosed initializer list>' to 'std::map<std::__cxx11::basic_string<char>,param_struct>'
   84 |     map<string,update_log)}}; //
      |                                                                                                  ^
      |                                                                                                  |
      |                                                                                                  <brace-enclosed initializer list>
// settings.h file
typedef void (*param_setter) (string,string);

class param_struct {
    string default_value; // built-in default configuration value
    string loaded_value; // configuration value loaded from the
    param_setter parsing_function;
    //    param_setter parsing_function; // pointer to the respective parsing/initialization function

public:
    friend class settings;
    param_struct();
    param_struct(string,string,param_setter);
    ~param_struct();

};


class settings {


    map<string,param_struct> config_params; // keywords and the respective values + parsing/initialization functions
/* lots of other declarations skipped */
    
    map <string,param_struct> create_builtin_config();
    
public:
    void update_log(string builtin_param,string user_param); // dummy function that does nothing,except writing a log entry. used to test config parameter parsing

    friend class param_struct;
}
//settings.cpp file:
settings::settings() {

    config_params = create_builtin_config();
}



map<string,param_struct> settings::create_builtin_config() {

    map<string,update_log)}}; //

    return builtin_config;
}

param_struct::param_struct(string defaultval,string loaded,param_setter parser_fn) {

    default_value = defaultval;
    loaded_value = loaded;
    parsing_function = parser_fn;


}

解决方法

update_log 是一个成员函数

您的 param_setter 类型是免费功能

它们不匹配。

成员函数有一个隐式的第一个参数——一个指向类的指针——并且与自由函数指针不兼容。

简单的解决方案是存储一个 std::function<void(string,string)>,然后传入 [this](string s1,string s2){ update_log(s1,s2); }。这也明确表明您在此处传入一个指向对象的指针;在存储它时,您需要删除移动/复制构造/赋值运算符,否则会得到非常令人惊讶的结果。

另一种选择是使 update_log 成为 static 成员函数,它与相同签名的自由函数兼容。但是,您无法访问类对象的状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。