C++中的Python样式变量



我正在处理一个C++项目,并试图弄清楚如何创建一个"动态"变量。

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

variable = 0
variable = "Hello"

在Java中,这也是(在某种程度上)可以实现的:

Object o = 0;
o = "Hello";

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

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

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

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

我发现了这样的东西:

template <typename name>

但不知道如何使用它。

您可以使用boost.variant库。此处提供基本使用说明。简而言之,它将类似

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

有些不简单的部分是在不知道确切类型的情况下访问值。这需要静态访问者。

如果你想知道anyvariant之间有什么区别,你并不孤单,这里是比较图。

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

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

如果你只需要接受一个已知的类型列表,你可以使用好的旧(来自C)并集或它们的boost自动等价boost::变体。

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

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

最新更新