Herb Sutter 提出了一个简单的 make_unique() 实现:http://herbsutter.com/gotw/_102/
Herb Sutter propose a simple implementation of make_unique() there: http://herbsutter.com/gotw/_102/
这是:
template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}
我的问题是可变参数模板还不是 VS2012 的一部分,所以我不能按原样使用此代码.
My problem is that variadic templates are not yet part of VS2012, so I can't use this code as is.
在 VS2012 中是否有一种可维护的方法来编写它,而不涉及使用不同的 args 计数复制粘贴相同的函数?
您可以使用 Boost.Preprocessor 来生成不同的参数计数,但我真的没有看到这样做的好处.简单地做一次繁重的工作,把它塞进一个标题中就可以了.您可以节省自己的编译时间并拥有 make_unique.
You could use Boost.Preprocessor to generate the different parameter counts, but I really don't see the advantage of that. Simply do the grunt job once, stuff it in a header and be done. You're saving yourself compile time and have your make_unique.
这里是我的 make_unique.h 标头的复制粘贴模拟最多 5 个参数的可变参数模板.
Here's a copy-paste of my make_unique.h header that simulates variadic templates for up to 5 arguments.
由于 OP 似乎不喜欢复制粘贴工作,这里是生成上述内容的 Boost.Preprocessor 代码:
Since OP seems to not like copy-paste work, here's the Boost.Preprocessor code to generate the above:
首先,创建一个包含多次模板头的主头(Boost.Preprocessor 迭代代码公然从这个答案中窃取)):
First, make a main header that includes the template header multiple times (Boost.Preprocessor iteration code blatantly stolen from this answer):
// make_unique.h
#include <memory>
#include <utility>
#include <boost/preprocessor.hpp>
#ifndef MAKE_UNIQUE_NUM_ARGS
// allow this to be changed to a higher number if needed,
// ten is a good default number
#define MAKE_UNIQUE_NUM_ARGS 10
#endif
#if MAKE_UNIQUE_NUM_ARGS < 0
// but don't be stupid with it
#error Invalid MAKE_UNIQUE_NUM_ARGS value.
#endif
/* optional, see above for premade version
// include premade functions, to avoid the costly iteration
#include "detail/blah_premade.hpp
// generate classes if needed
#if MAKE_UNIQUE_NUM_ARGS > MAKE_UNIQUE_NUM_PREMADE
*/
#define BOOST_PP_ITERATION_LIMITS (0, MAKE_UNIQUE_NUM_ARGS)
#define BOOST_PP_FILENAME_1 "make_unique_template.h"
#include BOOST_PP_ITERATE()
//#endif
现在制作一个模板标题,根据MAKE_UNIQUE_NUM_ARGS的值一次又一次地包含并以不同的方式扩展:
And now make a template header that gets included again and again and expands differently depending on the value of MAKE_UNIQUE_NUM_ARGS:
// make_unique_template.h
// note: no include guard
#define N BOOST_PP_ITERATION()
#define MAKE_UNIQUE_TEMPLATE_PARMS
BOOST_PP_ENUM_PARAMS(N, typename A)
#define MAKE_UNIQUE_FUNCTION_PARM(J,I,D)
BOOST_PP_CAT(A,I)&& BOOST_PP_CAT(a,I)
#define MAKE_UNIQUE_FUNCTION_PARMS
BOOST_PP_ENUM(N, MAKE_UNIQUE_FUNCTION_PARM, BOOST_PP_EMPTY)
#define MAKE_UNIQUE_ARG(J,I,D)
std::forward<BOOST_PP_CAT(A,I)>(BOOST_PP_CAT(a,I))
#define MAKE_UNIQUE_ARGS
BOOST_PP_ENUM(N, MAKE_UNIQUE_ARG, BOOST_PP_EMPTY)
template<class T BOOST_PP_COMMA_IF(N) MAKE_UNIQUE_TEMPLATE_PARMS>
std::unique_ptr<T> make_unique(MAKE_UNIQUE_FUNCTION_PARMS){
return std::unique_ptr<T>(new T(MAKE_UNIQUE_ARGS));
}
// clean up
#undef MAKE_UNIQUE_TEMPLATE_PARMS
#undef MAKE_UNIQUE_FUNCTION_PARM
#undef MAKE_UNIQUE_FUNCTION_PARMS
#undef MAKE_UNIQUE_ARG
#undef MAKE_UNIQUE_ARGS
#undef N
这篇关于有没有办法在 VS2012 中编写 make_unique() ?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!
为什么两个函数的地址相同?Why do two functions have the same address?(为什么两个函数的地址相同?)
为什么 std::function 的初始化程序必须是可复制构Why the initializer of std::function has to be CopyConstructible?(为什么 std::function 的初始化程序必须是可复制构造的?)
混合模板与多态性mixing templates with polymorphism(混合模板与多态性)
我什么时候应该使用关键字“typename"?使用模When should I use the keyword quot;typenamequot; when using templates(我什么时候应该使用关键字“typename?使用模板时)
依赖名称解析命名空间 std/标准库Dependent name resolution amp; namespace std / Standard Library(依赖名称解析命名空间 std/标准库)
gcc 可以编译可变参数模板,而 clang 不能gcc can compile a variadic template while clang cannot(gcc 可以编译可变参数模板,而 clang 不能)