我目前有一个数据库类,其中包含一些包含数据库变量的无序映射。我编写了添加和删除变量的函数,但现在想要一种方法来轻松访问和修改它们。
我的功能是这样的:
template<typename T>
T &get(const std::string &name){
if(typeid(T) == typeid(int))
return this->ints[name];
else if(typeid(T) == typeid(float))
return this->floats[name];
... ect ...
}
如果给出了无效的类型,则会抛出错误。
ints
是std::unordered_map<std::string, int>
类型
同样定义了floats
。
对我来说,这看起来是正确的。但是当我尝试运行它时,我收到以下错误:
database.hpp:98: error: invalid initialization of non-const reference of type 'int&' from an rvalue of type 'int'
看起来无序地图没有返回引用,问题是什么?
答案 0 :(得分:5)
Unline C#和Java泛型,C ++模板可以是专用的。强烈建议不要以你的方式测试类型。
如果您使用了专业化,那么您就不会遇到此问题,因为它与BartoszKP评论的转化相关。
template<typename T>
T& get(const std::string &name);
在课外,但仍然在标题内:
template<>
int& ClassName::get<int>(const std::string &name) { return ints[name]; }
template<>
float& ClassName::get<float>(const std::string &name) { return floats[name]; }