gpt4 book ai didi

c++ - 有没有办法在 VS2012 中编写 make_unique() ?

转载 作者:IT老高 更新时间:2023-10-28 22:19:20 25 4
gpt4 key购买 nike

Herb Sutter 提出了 make_unique() 的简单实现: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 的一部分,所以我不能按原样使用这段代码。

是否有一种可维护的方式在 VS2012 中编写此代码,而不涉及复制粘贴具有不同 args 计数的相同函数?

最佳答案

您可以使用 Boost.Preprocessor 生成不同的参数计数,但我真的看不出这样做的好处。只需完成一次繁重的工作,将其塞入标题中即可完成。您正在节省自己的编译时间并拥有您的 make_unique

Here是我的 make_unique.h header 的复制粘贴,可模拟最多 5 个参数的可变参数模板。


由于 OP 似乎不喜欢复制粘贴工作,这里是生成上述内容的 Boost.Preprocessor 代码:

首先,制作一个包含多次模板头的主头(Boost.Preprocessor 迭代代码公然从 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 的值进行不同的扩展:

// 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

关于c++ - 有没有办法在 VS2012 中编写 make_unique() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12547983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com