Python-C++ 风格的变量

Python-style variables in C++

我正在做一个 C++ 项目,我想弄清楚如何制作一个 "dynamic" 变量。

在Python中,变量可以有多种类型:

variable = 0
variable = "Hello"

在Java中,这也是(有点)可以实现的:

Object o = 0;
o = "Hello";

根据我能找到的与 C++ 相关的内容,那里没有 object 类型或 "dynamic" 对象。

我需要这个的原因是我正在尝试创建一个接受以下任何类型的对象: intfloatcharstringbool,并允许我进行如下操作:

object o = 0; // currently an int
o -= 2.5; // now a float
o += "Test"; // now a string

这种变量有默认功能吗?如果没有,是否可以用宏、struct 等来完成?

我发现了这样的东西:

template <typename name>

但是不知道怎么用

您可以使用 boost.variant library. Basic usage instructions here。简而言之,就像

using var_t = boost::variant<bool,int,double,string, boost::blank_t>;
var_t var = "hello";
std::cout << boost::get<std::string>(var) << '\n';
std::cout << var << '\n'; // if all possible stored types are streamable

有点不直接的部分是在不知道确切类型的情况下访问值。这需要 static visitor.

如果您想知道 anyvariant 之间的区别 - 您并不孤单,here is the comparison chart.

每种语言都有自己惯用的结构,您应该而不是尝试模仿Python C++ 中的代码。正如 @user2296177 所说,最接近的 C++ 工具(在当前版本中)是 boost::any,它也作为 std::any.

包含在 C++17 中

但即使 boost:any 也有一些限制:分配给 boost::any 的类型必须是复制构造函数,并且它们的析构函数绝不能抛出异常。

如果您只需要接受一个已知的类型列表,您可以使用旧的(来自 C)联合或它们的 boost 自动等价物 boost::variant。

但事实上,您应该想知道为什么需要它,您打算如何跟踪实际类型,是否需要允许转换或别名。因为除了动态 Python 变量之外,C++ 还允许在类型之间进行转换或别名。

TL/DR:不要试图模仿Python的成语,仔细分析你真正需要的是什么。在某些用例中联合可能是工具,在其他一些用例中可能需要空指针或专用结构。这真的取决于实际用例。