在JavaScript中,我将一个对象声明为:
rectangle = {
length: 4,
height: 2
}
在C ++中,我这样做
struct Rectangle {
int length;
int height;
};
rectangle = Rectangle {
int {4},
int {2}
}
我认为C ++风格不如JavaScript风格,因为:
是否可以以与JavaScript方式更类似的方式声明C ++对象?
答案 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;
}
答案 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)