Python-C++ 风格的变量
Python-style variables in C++
我正在做一个 C++ 项目,我想弄清楚如何制作一个 "dynamic" 变量。
在Python中,变量可以有多种类型:
variable = 0
variable = "Hello"
在Java中,这也是(有点)可以实现的:
Object o = 0;
o = "Hello";
根据我能找到的与 C++ 相关的内容,那里没有 object
类型或 "dynamic" 对象。
我需要这个的原因是我正在尝试创建一个接受以下任何类型的对象:
int
、float
、char
、string
、bool
,并允许我进行如下操作:
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.
如果您想知道 any
和 variant
之间的区别 - 您并不孤单,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的成语,仔细分析你真正需要的是什么。在某些用例中联合可能是工具,在其他一些用例中可能需要空指针或专用结构。这真的取决于实际用例。
我正在做一个 C++ 项目,我想弄清楚如何制作一个 "dynamic" 变量。
在Python中,变量可以有多种类型:
variable = 0
variable = "Hello"
在Java中,这也是(有点)可以实现的:
Object o = 0;
o = "Hello";
根据我能找到的与 C++ 相关的内容,那里没有 object
类型或 "dynamic" 对象。
我需要这个的原因是我正在尝试创建一个接受以下任何类型的对象:
int
、float
、char
、string
、bool
,并允许我进行如下操作:
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.
如果您想知道 any
和 variant
之间的区别 - 您并不孤单,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的成语,仔细分析你真正需要的是什么。在某些用例中联合可能是工具,在其他一些用例中可能需要空指针或专用结构。这真的取决于实际用例。