emplace_back()在Visual Studio 2012中如何在没有可变模板的情况下工作
How emplace_back() works without variadic templates in Visual Studio 2012?
使用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)。
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 为什么它在不分配内存的情况下工作正常
- 此函数如何在不传递任何参数的情况下工作?
- c++ 中的函数重载如何在没有钻石继承的情况下工作?
- 为什么我的代码在没有 chroot 函数的情况下工作,但使用 chroot 函数失败?
- 为什么Arduino(小端序)上的Sha1在没有转换为大端序的情况下工作?
- 如何编写一个通用函数,该通用函数在没有任何条件和条件的情况下工作(无论是真实和错误)
- OpenMP程序在没有关键部分的情况下工作
- EM_SETHANDLE,EM_GETHANDLE在没有DS_LOCALEDIT的情况下工作
- C++余弦在没有 std 命名空间的情况下工作 - 为什么
- 斯芬克斯在没有数据库的情况下工作吗
- pow()函数在没有任何数学库的情况下工作
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 共享指针在未分配的情况下工作
- 为什么boost this_thread::interrupt可以在没有try-catch的情况下工作
- SDL如何在没有源文件的情况下工作
- 为什么模板类的显式方法专门化可以在类内部没有原型声明的情况下工作
- 子进程中的Execl仅在特定情况下工作
- Android OpenCV imread 标志致命异常,imread 在没有标志的情况下工作正常,像素输出与 MATLAB 不匹配
- Visual c++ /MFC:让日文字符在没有UNICODE的情况下工作