C++ 获取具有默认值的地图元素的模板
问题:C++ 获取具有默认值的地图元素的模板,c++,map,C++,Map,问题: template <typename T> inline T getmap(const std::map<std::string, std::string> &m, const char* key, const T def, T (*f)(const char*) = NULL) { std::map<std::string, std::string>::const_iterator i = m.find(std::string(key
template <typename T> inline
T getmap(const std::map<std::string, std::string> &m, const char* key, const T def, T (*f)(const char*) = NULL) {
std::map<std::string, std::string>::const_iterator i = m.find(std::string(key));
return i == m.end() ? def : (f == NULL ? i->second.c_str() : f(i->second.c_str()));
}
inline int getmap(const std::map<std::string, std::string> &m, const char* key, const int def) {
return getmap<int>(m, key, def, &std::atoi);
}
float atofl(const char* s) {
return (float)std::atof(s);
}
inline float getmap(const std::map<std::string, std::string> &m, const char* key, const float def) {
return getmap<float>(m, key, def, &atofl);
}
inline char* getmap(const std::map<std::string, std::string> &m, const char* key, const char* def) {
return getmap<char*>(m, key, def); // ERROR HERE
}
我试图创建一个函数getmap
,该函数获取map
元素,但如果不存在,则返回指定的默认值(即getmap(mymap,“keyA”,mydefault);
我将其模板化为int、float
和char*
返回类型,但我得到一个错误:
error C2664: 'getmap' : cannot convert parameter 3 from 'const char *' to 'char *const '
即使我没有使用char*const
。为什么会发生这种情况
代码:
template <typename T> inline
T getmap(const std::map<std::string, std::string> &m, const char* key, const T def, T (*f)(const char*) = NULL) {
std::map<std::string, std::string>::const_iterator i = m.find(std::string(key));
return i == m.end() ? def : (f == NULL ? i->second.c_str() : f(i->second.c_str()));
}
inline int getmap(const std::map<std::string, std::string> &m, const char* key, const int def) {
return getmap<int>(m, key, def, &std::atoi);
}
float atofl(const char* s) {
return (float)std::atof(s);
}
inline float getmap(const std::map<std::string, std::string> &m, const char* key, const float def) {
return getmap<float>(m, key, def, &atofl);
}
inline char* getmap(const std::map<std::string, std::string> &m, const char* key, const char* def) {
return getmap<char*>(m, key, def); // ERROR HERE
}
模板内联
T getmap(const std::map&m,const char*键,const T def,T(*f)(const char*)=NULL){
std::map::const_迭代器i=m.find(std::string(key));
返回i==m.end()?def:(f==NULL?i->second.c_str():f(i->second.c_str());
}
内联int getmap(const std::map&m、const char*键、const int def){
返回getmap(m、key、def和std::atoi);
}
浮动atofl(常量字符*s){
返回(浮动)标准::atof(s);
}
内联浮点getmap(常量std::map&m、常量char*键、常量float def){
返回getmap(m、key、def和atofl);
}
内联字符*getmap(常量std::map&m,常量字符*键,常量字符*定义){
返回getmap(m,key,def);//此处出错
}
getmap(m,key,def);
使getmap
的T
成为char*
。您接受的第三个参数是const T
。我知道看起来应该是const char*
,但实际上是char*const
然后,正如错误所说,您正试图将一个常量char*
传递给一个char*const
。您可以将一个非常量传递给一个常量,但不能反过来
所以写下这个
getmap<const char*>(m, key, def);
^^^^^
getmap(m,key,def);
^^^^^
getmap(m,key,def);
使getmap
的T
成为char*
。您接受的第三个参数是const T
。我知道看起来应该是const char*
,但实际上是char*const
然后,正如错误所说,您正试图将一个常量char*
传递给一个char*const
。您可以将一个非常量传递给一个常量,但不能反过来
所以写下这个
getmap<const char*>(m, key, def);
^^^^^
getmap(m,key,def);
^^^^^
为什么要将常量char*传递给一个需要指向函数指针的函数?为什么要使用char*
呢?@user814628-你指的是哪里?Thanks@AlexanderTobiasHeinrich-映射是
,但我只希望能够执行类似getmap(mymap,“keyA”,mydefault)的操作;
无需执行std::string(“keyA”)
首先。@MiloChen Nevermind,准备好了就错了。你为什么要把常量char*传递给一个需要指向函数指针的函数?你为什么要使用char*
呢?@user814628-你指的是哪里?Thanks@AlexanderTobiasHeinrich-地图是
,但我只想做一些类似getma的事情p(mymap,“keyA”,mydefault);
无需先执行std::string(“keyA”)
。@MiloChen无需担心,准备好了就错了。只需将参数和T设置为const char*const
?只需将参数和T设置为const char*const
?