使用各种数据类型成员创建对象的简便方法

Easy way to create object with members of various datatypes

本文关键字:方法 创建对象 成员 数据类型      更新时间:2023-10-16

在C 中,我经常需要使用一个非常简单的,原始的对象,其中包含各种数据类型,以便我可以在功能之间轻松地将其传递。在Python,我通过使用字典来实现这一目标。例如:

easy = {"keyframe_range":[], "value":0.25, "interpolation":"bezier"}

但是,在C 中,如果我想创建类似的东西,我需要:

struct obj
{
  vector<int> keyframe_range;
  float value;
  string interpolation;
  obj(vector<int> vv, float ff, string ss) : keyframe_range(vv), value(ff), interpolation(ss) {}
};
obj easy(vector<int>(), 0.25, "bezier");

当我需要创建谁一时兴起的对象时,这是极低的效率,并且浪费时间浪费时间来为我需要的每个对象手动编写参数化的构造函数。在Python中,我可以从本质上避免使用字典。但是,C 中的unordered_maps必须映射到相同的数据类型,因此它们并不是我真正想要的。

本质上,我只是想要一种简单的方法来创建一个简单的对象,该对象充当各种数据类型的项目的集合,仅此而已。可以在C 11中完成,如果是的话,如何?

这是极低的效率,并且浪费时间来手动写作 我需要的每个对象的参数化构造函数。

我完全同意。但是,没有问题,因为您实际上不需要为每个简单结构编写构造函数:

#include <vector>
#include <string>
#include <iostream>
struct obj
{
    std::vector<int> keyframe_range;
    float value;
    std::string interpolation;
};
int main() {
    obj easy{ {}, 0.25, "bezier"};
    std::cout << easy.value << " " << easy.interpolation;        
}

它称为汇总初始化,可以在类具有

时完成
  • 没有私人或受保护的直接(自C 17(非静态数据成员

  • 没有用户指定的构造函数(直到C 11(

  • 没有用户提供的构造函数(允许明确默认或删除的构造函数((因为C 11((直到C 17(

  • 不提供用户提供,继承或显式构造函数(允许明确默认或删除的构造函数((由于C 17((直到 C 20(

  • 没有用户指定或继承的构造函数 [...]

和几个限制,通常都适用于这样的简单结构(它们称为聚合(。

本质上,我只是想要一种简单的方法来创建一个简单的对象 它充当各种数据类型的项目的集合,什么也没有 更多的。可以在C 11中完成,如果是的话,如何?

另外,您应该看一下std::tuple,尽管编写自己的班级的好处是给成员有意义的名字,并且可以区分AS std::tuple完全相同的类型。

另一方面,std::tuple的优点是它带有几个已经定义的操作员(例如operator<(。因此,根据您的用例,您可以选择一个或另一个。

您可以使用std::tuple。它使您可以创建一个异质类型的对象,而无需指定所有锅炉板。虽然确实有一个偏低的一面。您不能给元组成员一个名字。您必须通过"索引"访问它们(第一个成员是索引0(或类型(这仅在不复制类型的情况下起作用(。所以

easy = {"keyframe_range":[], "value":0.25, "interpolation":"bezier"}

将成为

auto easy = std::tuple<std::vector<int>, float, std::string>{{}, 0.25, "bezier"}

ans您将访问诸如std::get<1>(easy)/std::get<float>(easy)之类的成员以获取float成员。


c 17:您可以使用结构化绑定来命名访问

之类的成员
auto&[easy_vec, easy_float, easy_string] = easy;

和现在的easy_veceasy_floateasy_string是元组成员。