如何解决如何初始化指向在映射中用作值的类中的函数的指针?
我正在编写一个程序,其行为由用户定义的设置控制,通过包含关键字和值的普通 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 举报,一经查实,本站将立刻删除。