emplace_back()在Visual Studio 2012中如何在没有可变模板的情况下工作

How emplace_back() works without variadic templates in Visual Studio 2012?

本文关键字:情况下 工作 back Visual 2012 Studio emplace      更新时间:2023-10-16

使用Visual Studio 2012与toolset v110我可以使用容器的emplace_back()函数,但不能使用std::forward与可变模板-接受任何数量的参数。怎么做呢?

例如,make_unique<>()不会编译:

template<typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts&&... params)
{
  return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}

根据支持的c++ 11语言特性的官方列表,可变模板在VS 2012中不支持。

在同一页下面有以下注释:

Variadics: Visual c++在Visual Studio 2012中有一个方案模拟可变模板。在Visual Studio 2013中的Visual c++中,模拟已经结束,变量已经完全实现。如果你的代码依赖于旧的模拟变量行为,您必须修复它。但是,向真正的可变模板的转换得到了改进编译时间和减少编译器内存消耗。

在另一页上有这个注释告诉模拟是如何完成的:

多年来,我们用两种不同的"伪可变"预处理器宏系统来模拟可变模板——第一种系统涉及重复包括子标题,而第二系统(更优雅,就爬行恐怖而言)消除了子标题,并将它们替换为大的反斜杠继续宏都被其他宏消灭了。函数应该是真正的可变变量,如make_shared(args…),实际上被实现了重载:make_shared(), make_shared(arg0),Make_shared (arg0, arg1)等。这些课应该是真正的可变变量,像元组一样,实际上是用默认模板参数和部分专门化。这使得我们将为您带来make_shared/tuple/等。几年前,但它有很多问题。这些宏非常难以维护,这使得它很难维护查找并修复受影响代码中的错误。发了那么多重载和专门化增加了编译时间,并降低了性能智能感知。最后是无穷大问题。我们最初消除了0到10个参数的重载/专门化,但随着各种机械数量的增加,从TR1到从c++ 0x进化到c++ 11的最终形式,我们把无穷大从10降低了在Visual c++ 2012中增加到5,以改善大多数程序的编译时间用户(我们提供了一种通过a请求旧的10个限制的方法)宏,_VARIADIC_MAX)。