我可以使用名称而不是类型声明对象文字吗?

时间:2019-01-14 08:31:07

标签: c++

在JavaScript中,我将一个对象声明为:

rectangle = {
    length: 4,
    height: 2
}

在C ++中,我这样做

struct Rectangle {
    int length;
    int height;
};

rectangle = Rectangle {
    int {4},
    int {2}
}

我认为C ++风格不如JavaScript风格,因为:

  • 类型传达的相关信息少于名称
  • 属性不能以任意顺序列出

是否可以以与JavaScript方式更类似的方式声明C ++对象?

4 个答案:

答案 0 :(得分:6)

自C ++ 20起,您可以执行以下操作:

auto rectangle = Rectangle{ .length = 4, .height = 2 };

即使尚未发布C ++ 20,一些编译器也已开始支持此语法。

答案 1 :(得分:4)

从C ++角度看,JavaScript中的对象是成对的两个映射(一个用于属性,另一个用于内部属性)。可以使用一些标准容器来实现它们。此示例显示了属性映射的基本实现。通过使用自定义替换std::any可以改善对字段的访问,因此可以避免使用长::std::any_cast<double>(之类的强制类型转换。您甚至可以模拟奇怪的js比较和转换规则。

#include <iostream>
#include <map>
#include <string>
#include <any>
using object = ::std::map<::std::string, ::std::any>;
int main()
{
    object rectangle{{"length", 3.0}, {"height", 2.0}};
    //object rectangle{{"height", 2.0}, {"length", 3.0}}; // Fine too
    ::std::cout << ::std::any_cast<double>(rectangle["length"]) << ::std::endl;
    ::std::cout << ::std::any_cast<double>(rectangle["height"]) << ::std::endl;
    return 0;
}

online compiler

答案 2 :(得分:3)

您如何给表示此类的参数类呢?

struct Height
{
    explicit Height(int h) : height(h) {}

    int height;
};

struct Length
{
    explicit Length(int l) : length(l) {}

    int length;
};

struct Rectangle
{
    Rectangle(Height h, Length l) : length(l.length), height(h.height) {}

    int length;
    int height;
};


int main()
{
    auto rect = Rectangle(Height(4), Length(5));
}

另一个不错的方法是命名参数idom,您的设置员可以像这样被链接起来:

struct Rectangle
{
    Rectangle() = default;

    Rectangle& setHeight(int h) { height = h; return *this; }
    Rectangle& setLength(int l) { length = l; return *this; }

    int length;
    int height;
};


int main()
{
    auto namedParameterIdom = Rectangle{}.setHeight(4).setLength(1);
}

答案 3 :(得分:2)

"return"
从C ++ 11开始

是可能的。

我们将其称为列表初始化https://en.cppreference.com/w/cpp/language/list_initialization