Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可以用c++;?_C++_List_Class_Templates_Vector - Fatal编程技术网

C++ 可以用c++;?

C++ 可以用c++;?,c++,list,class,templates,vector,C++,List,Class,Templates,Vector,我想创建一个至少有一个成员变量具有泛型类型的结构/类。T可以是从位集到字符数组的任何内容。让我们称之为“场” 然后,我想要一个包含多个字段对象实例的列表/向量/数组 < C++ > 这样的数据结构是可能的吗? 这就是我的解决方案现在的样子,它没有编译是因为 错误C3203:“字段”:非专用类模板不能用作 模板参数“\u Ty”的模板参数应为实类型 错误C2955:“字段”:使用类模板需要模板 参数表 主类 { 公众: 模板类字段{ 公众: CString名称; 布尔州; T实际价值; }; 向量

我想创建一个至少有一个成员变量具有泛型类型的结构/类。T可以是从位集到字符数组的任何内容。让我们称之为“场”

然后,我想要一个包含多个字段对象实例的列表/向量/数组

< C++ >

这样的数据结构是可能的吗? 这就是我的解决方案现在的样子,它没有编译是因为

错误C3203:“字段”:非专用类模板不能用作 模板参数“\u Ty”的模板参数应为实类型
错误C2955:“字段”:使用类模板需要模板 参数表

主类
{
公众:
模板类字段{
公众:
CString名称;
布尔州;
T实际价值;
};
向量m_信息;
};

field1=新字段();
field1.actualValue=1;
字段2=新字段();
field2.actualValue=1.1;
矢量信息;
消息。推回(字段1);
消息。推回(字段2);

这是我第一次在stack overflow上发帖,所以我为任何格式错误或问题歧义道歉。

不完全如此。当我们在向量上迭代时,问题来了

for (...:iteraor e....) {
   e->m_Message.actualValue;
}
实际价值的类型是什么?你可能会说,每次都不同,但是C++没有这样工作,代码中的每个表达式都有1种类型。(除了模板,但这基本上只是为您输入的每种类型提供一份新的代码副本)

可以为所有字段创建基类,然后创建but引用(但不能复制到向量中)

class字段库{
公众:
CString名称;
布尔州;
};
模板
类字段公共:FieldBase
{
公众:
T实际价值;
};
向量m_信息;

然后,您需要发送一些关于您正在处理的消息类型的消息。重载方法可能。

每个实例化的模板类都有不同的数据类型。在声明vector时,字段应该定义了数据类型,但在这里不是

我想,你要找的是一个变体类。有些库(如Qt)提供变体,例如QVariant


但是,变体本身不是模板类,也不能是模板类。变量类通常使用并集和void指针实现。它是动态类型行为的实现。该类型在运行时是动态的。相反,模板在运行时不是动态的。类型是在编译时确定的,否则编译器会停止,或者没有生成代码。

最重要的是,您的示例代码是错误的。正确的版本将是

Field<int> field1 = Field<int>();
field1.actualValue = 1;

Field<double> field2 = Field<double>();
field2.actualValue = 1.1;
这就是模板实例化的工作原理-在编译时进行。当编译器遇到
字段
时,它会根据模板代码创建一个新类

现在您正试图将不同版本的
字段
推入
向量

vector<???> message;
message.push_back(field1);
message.push_back(field2);

有了足够的元编程,您几乎可以做任何事情

在本例中,您可能需要查看
boost::variant
,它存储任何一组固定类型中的一个,并为您提供对它的类型安全访问。如果失败,
boost::any
可以保存任何类型中的一种,但是只有知道存储在其中的确切类型,才能将类型取出

接下来,类型擦除/运行时概念的技术允许您对类型抽象出一组有限的操作,并将其存储在任意等价的文件中,同时允许您对数据执行该组有限的操作

可能更容易的方法是发明一个基类,存储它的
std::unique_ptr
s,并存储派生实例。如果需要,使用动态强制转换获取特定子类型


如果这些都不工作,你可以一直运行脚本语言,用C++语言编写代码。许多脚本语言可以嵌入到C++中,而严肃的应用程序通常使用这种嵌入式脚本语言。

它不是模板类,它是类模板,也就是构建类的配方。但是
vector
要求的是完整的类型,而不是配方。不过,您可能还想看看
boost::any
vector*field1=newmain::Field()除了上面提到的问题之外,您可能需要制作
a类模板,然后在内部使用
向量
class FieldBase {
    public:
        CString name;
        bool state;
};
template<typename T>
class Field public: FieldBase
{
 public:
   T actualValue;
};
vector<FieldBase*> m_Message;
Field<int> field1 = Field<int>();
field1.actualValue = 1;

Field<double> field2 = Field<double>();
field2.actualValue = 1.1;
template <typename T> class Field { ... };

Field<int> field1 = Field<int>();
field1.actualValue = 1;

Field<double> field2 = Field<double>();
field2.actualValue = 1.1;
class Field_int { /* int version of Field */ };
Field_int field1 = Field_int();
field1.actualValue = 1;

class Field_double { /* double version of Field */ };
Field_double field1 = Field_double();
field1.actualValue = 1;
vector<???> message;
message.push_back(field1);
message.push_back(field2);
#include <boost/any.hpp>

class Field
{
    CString name;
    bool state;
    boost::any actualValue;
};

vector<Field> messages;

Field field1;
field1.actualValue = 1;
messages.push_back(field1);

Field field2;
field1.actualValue = 1.1;
messages.push_back(field2);