C++中是否有像JavaScript中那样完全通用的对象



我是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;

相关内容

  • 没有找到相关文章

最新更新