c++ 相当于 c# 9.0 New() 并具有推导类型

use*_*671 0 c++ new-operator

C# 9+ 知道从 LHS 推断出 RHS 的类型,只需New使用正确的参数进行调用并获得您的对象。无需重复冗长的类型,并且类型始终正确

List<int> ints = New(capacity: 10_000);
Run Code Online (Sandbox Code Playgroud)

可以同样DRY吗new在 C++ 中可以完成

我有类似的东西使用“安全”new 和删除,将目标作为参数并使用模板推断类型等,但它的可读性比仅仅要差一些my_var = new(arg1, arg2, arg3)

请注意,这是一个关于如何做的问题a = new(1,2,3),就像 C# 一样,而不是关于现在在 C++ 中创建新对象,这使得看起来像 list<vector<toupel<int,float,char>>>*a = new list<vector<toupel<int,float,char>>>() “有时用shared_ptrand co 进行包装”。

新运营商

Som*_*ude 8

首先,您应该很少在现代 C++ 中使用显式内存管理。使用智能指针,例如std::unique_ptr所有权语义。

至于你的问题,你可以用大致相同的方式来做,但有点相反:自动推导声明中的类型,并在表达式中指定类型new

auto* my_pointer = new MyClass<template_type>(arguments, to, constructor);
Run Code Online (Sandbox Code Playgroud)

或者使用唯一指针:

auto my_unique_pointer = std::make_unique<MyClass<template_type>>(arguments, to, constructor);
Run Code Online (Sandbox Code Playgroud)

至于容器的主题,您几乎不应该创建指向容器的指针。如果您需要一个容器,只需创建它的一个实例:

std::vector<int> v1(10000);  // Create a vector of 10000 integers
Run Code Online (Sandbox Code Playgroud)

  • @user1656671 • 您在C#9+ 中所做的事情在现代C++ 中被认为是不好的做法。在某种程度上,因为 C# 是一种托管语言,而 C++ 是一种非托管语言...所以 C# 中的最佳实践(引用的混杂所有权;IDisposable)在 C++ 中是糟糕的实践(因为它们会导致内存泄漏和糟糕的性能) /所有权混乱)。在罗马做到入乡随俗。我建议不要让 C++ 变得像 C#,反之亦然。 (2认同)
  • @user1656671 啊,你的意思是“重新分配”一个新对象给一个已经存在的对象?就像`some_vector = std::vector&lt;int&gt;(10000);`?那么如果不重复C++中的类型就无法做到这一点。虽然 C++ 和 C# 之间的某些语句可能看起来相似,但您必须记住它们最终是两种“非常”不同的语言。就像法语和西班牙语一样,都是浪漫语言(共同词根为通俗拉丁语),但仍然是两种完全不同的语言。 (2认同)