我是C++的新手,但在Javascript方面有一些经验。
在JavaScript中,当我写:
var object = {};
我创建了一个对象;完全通用";从某种意义上说,它没有成员/功能,但通过稍后添加该成员,它可以拥有我们喜欢的任何成员。
我可以在C++中创建或模拟这种对象吗?
答案大多是否定的,你不能。在JavaScript中,Object
可以被比作一个字典或从键到类型值的映射,其中值及其类型都可以在运行时设置。
可以使用std::any
的类型擦除功能和键的字符串,在C++中创建任意类型值的字典。用这种方法,你可以写:
using generic_object = std::unordered_map<std::string, std::any>
generic_object object;
object["foo"] = 123;
object["bar"] = [](char c) -> char { return c+1; };
object["baz"] = std::vector<int>{4,5,6,7};
std::any_cast<std::vector<int>>(object["bar"])[2] = 3 + std::any_cast<int>(object["foo"]);
您不能在泛型对象中的新字段上使用简单明了的C++语法,也就是说,您不能写入:
using generic_object = /* whatever */;
generic_object object;
object.foo = 123; // Compilation errors start here!
object.bar = []() -> char { return c+1; }
object.baz = std::vector<int>{4,5,6,7};
object.baz[2] = 3 + object.foo;
std::cout << "'a' becomes " << object.bar('a') << 'n';
就像你从JavaScript中可能习惯的那样。相反,它必须是:
struct {
int foo;
char (*bar)(char c);
std::vector<int> baz;
} object;
object.foo = 123;
object.bar = []() -> char { return c+1; }
object.baz = std::vector<int>{4,5,6,7};
object.baz[2] = 3 + object.foo;
std::cout << "'a' becomes " << object.bar('a') << 'n';
这就是";静态类型的";C++的性质。或者更进一步,避免函数指针:
struct {
int foo { 123 };
char bar(char c) const { return c+1; }
std::vector<int> baz {4,5,6,7};
} object;
object.baz[2] = 3 + object.foo;
std::cout << "'a' becomes " << object.bar('a') << 'n';
使用清晰键入的方法,而不是";任何人的字典;我在上面描述过;那会很麻烦,很慢,而且大多数人都不赞成。
另请参阅:
静态类型语言和动态类型语言之间的区别是什么
JavaScript是动态类型的,而C++是静态类型的。
在JavaScript中,如您在示例中所示,您只需要编写变量名,而不需要添加类型。之后,您可以指定字符串值,也可以指定int值或任何其他类型的值。
示例:
var first;
var second;
在C++中,必须用变量声明变量的类型。
示例:
std::string str_value;
float float_value;
int int_value;