如何在c++中生成一个变量的不确定类型
How to make make a variable undetermined type in c++?
例如,我有一个包含的节点
Node * next;
[X] data;
我怎么能填写[X],这样我就可以生成A、B、C、D类型的"数据",我稍后会确定。我试图使其无效,但这只会导致错误。我使用它来创建一个包含一个变量的链表,该变量可以是a B C D类型。
您可以使用模板,也可以使用void指针(当模板可以起作用时,您不应该在C++中使用void指针)。
template <typename T>
struct Node {
Node * next;
T data;
};
现在Node<int>
和Node<float>
是不同的类型。您可以使用任何类型作为参数,只要该类型可以是默认构造的。如果您想将T
限制为一组类型中的一个,那么答案会涉及更多,但通常没有充分的理由这样做。
另一方面,如果您希望单个链表能够容纳许多不同的类型,则T
必须能够表示所有这些类型。例如,如果要存储的所有类型都派生自公共类A
,则可以使用Node<std::unique_ptr<A>>
,然后可以在该特定列表中存储A
或A
的任何其他派生子类型。
如果您希望一个列表能够容纳一组不相关类型中的任何一个的元素,则需要构建一个能够存储所有这些元素的"变体"结构,以及指示其当前包含的类型的某个字段,然后使用该变体结构作为Node
的类型参数。
如果您希望一个列表能够容纳任何类型的元素,那么除了为data
:Node<void *>
使用空指针之外,您没有太多选项。但这种技术有很多需要注意的地方,主要是决定谁拥有指向的分配,并找出删除它们的正确方法。
(请注意,尽管我写了Node * next
,但next
实际上是Node<T> *
。在Node
类中,模板参数是隐含的。)
C++是强类型的,因此需要在编译时知道所有类型。
你可以考虑使用模板:
template<typename T>
void f(T s)
{
std::cout << s << 'n';
}
template void f<double>(double); // instantiates f<double>(double)
template void f<>(char); // instantiates f<char>(char), template argument deduced
template void f(int); // instantiates f<int>(int), template argument deduced
示例
或A、B、C&D都可以从一个类继承,然后可以将它们存储为父类。它的内容比我在一个小例子中所能轻易展示的要多得多,所以这里有一个有用的链接
基本上,作为一个概念示例,您可以有一个父类vehicle
,并有一个vehicle
s的列表。
然后,您将实际生成存储在列表中的几个car
s、motorbike
s和truck
s(它们都继承自vehicle
)(因为它们都是vehicle
s以及它们自己的子类。
- 用C++中的一个变量定义一个常量
- 一个变量的输入值也会保存到另一个变量中
- 将双精度变量设置为另一个变量的值
- 对具有相同方法的不同类使用一个变量
- 为什么一个变量获得与另一个值相同的值
- 尝试在 C++ 中为 ifstream 提供一个变量
- 类中的一个变量显示,但另一个不显示
- 声明一个变量,该变量在 c++ 或 c 中具有值,当程序终止时不会被销毁
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 如何将一个变量用于父类和派生类
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 我如何将一个变量与另一个变量进行比较,例如我想如果(var1 > var2 x 1),然后执行此 c++
- 如何在一个函数中定义一个变量,并在另一个函数中访问和更改它?(C++)
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 迭代器或反向器的一个变量
- fstream库,试图创建一个变量名为(c++)的文件
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 如何将一些变量放在一个变量中?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 如何用索引命名一个变量来存储输入 mxArray?