std::map 保存任何值类型
std::map holding any value type
Code:
#include <iostream>
#include<map>
using namespace std;
class MyClass {
public:
class MyFieldInterface
{
public:
int m_Size;
~MyFieldInterface() = default;
};
template <typename T>
class MyField : public MyFieldInterface {
public:
MyField(T val) {m_Value = val;}
T m_Value;
};
template <typename T>
MyField<T>* getType(int type, T val) {
if (type == 0) return new MyField<int>(val);
if (type == 1) return new MyField<double>(val);
if (type == 2) return new MyField<char>(val);
}
map<string, MyFieldInterface* > fields;
};
int main()
{
MyClass obj;
obj.fields["a"] = obj.getType<int>(0, 1);
obj.fields["b"] = obj.getType<double>(1, 1.1);
obj.fields["c"] = obj.getType<char>(2, 'a');
return 0;
}
问题:
我希望std::map
保存任何值类型,因此我创建了一个具有动态继承的模板类。 我已经在MyClass
中定义了模板类,因为我不希望它的定义暴露给用户。使用getType
函数,我将创建一个具有给定类型的新对象,该对象将存储在地图中。
使用上述方法,我得到以下错误,我无法使用上述方法成功。
main.cpp: In instantiation of ‘MyClass::MyField<T>* MyClass::getType(int, T) [with T = int]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',45)">main.cpp:45:44</span>: required from here
main.cpp:34:53: error: cannot convert ‘MyClass::MyField*’ to ‘MyClass::MyField*’ in return
if (type == 1) return new MyField<double>(val);
^
main.cpp:35:51: error: cannot convert ‘MyClass::MyField*’ to ‘MyClass::MyField*’ in return
if (type == 2) return new MyField<char>(val);
^
main.cpp: In instantiation of ‘MyClass::MyField<T>* MyClass::getType(int, T) [with T = double]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',46)">main.cpp:46:49</span>: required from here
main.cpp:33:50: error: cannot convert ‘MyClass::MyField*’ to ‘MyClass::MyField*’ in return
if (type == 0) return new MyField<int>(val);
^
main.cpp:35:51: error: cannot convert ‘MyClass::MyField*’ to ‘MyClass::MyField*’ in return
if (type == 2) return new MyField<char>(val);
^
main.cpp: In instantiation of ‘MyClass::MyField<T>* MyClass::getType(int, T) [with T = char]’:
<span class="error_line" onclick="ide.gotoLine('main.cpp',47)">main.cpp:47:47</span>: required from here
main.cpp:33:50: error: cannot convert ‘MyClass::MyField*’ to ‘MyClass::MyField*’ in return
if (type == 0) return new MyField<int>(val);
^
main.cpp:34:53: error: cannot convert ‘MyClass::MyField*’ to ‘MyClass::MyField*’ in return
if (type == 1) return new MyField<double>(val);
^
不能使用运行时参数在多个类型之间进行选择。您需要决定在编译时返回哪种类型。但这正是模板的用途,所以你可以简单地做:
template <typename T>
MyField<T>* getType(T val) {
return new MyField<T>(val);
}
然后像这样使用函数:
obj.fields["a"] = obj.getType(1);
obj.fields["b"] = obj.getType(1.1);
obj.fields["c"] = obj.getType('a');
请注意,您不需要在调用站点指定T
,因为这可以从函数参数中推导出来。
当然,您需要跟踪地图中每个键分别引用的类型。
这是一个演示。
此外,此函数的实现方式,名称getType
令人困惑,因为您实际上并没有在此处返回类型。也许更好的名字是getAnyPointer
.
相关文章:
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 修改"std::set"中用户定义类型的值
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- std::map 保存任何值类型
- 如何在不同类型的值之间进行选择以传递给多态函数?
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- C++指针中的这两种类型的值分配有什么区别?
- 不能将 "void *" 类型的值分配给类型 "RANDOMSTRUCT *" 的实体
- C++ 矢量未显示我插入的任何值
- 具有默认类型和值的模板参数
- 在 C++ 中编写一个程序,要求用户输入 C++ 中所有基元类型的值
- 使用 C++17,如何创建类型到值的编译时图?
- 如何将不同模板参数值但相同类型的值放入这种类型的变量中?C++
- 为什么我的变量在我尚未将其设置为任何值时返回一个值?
- 如何从模板获取类型和值信息
- CORBA::String_var -> 我无法为这种类型的类字段分配任何值
- 映射中的任何类型的值
- C++ 中的映射,可以接受任何类型的值