C++ 如何在C++;11?
我的编译器不支持使_唯一。怎么写C++ 如何在C++;11?,c++,c++11,unique-ptr,c++14,C++,C++11,Unique Ptr,C++14,我的编译器不支持使_唯一。怎么写 template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ); 模板唯一性(Args&&…Args); 斯蒂芬·拉瓦维(Stephan T.Lavavej,STL也知道)的版本,他最初提议将此函数添加到C++14中 #include <cstddef> #include <memory> #includ
template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args );
模板唯一性(Args&&…Args);
斯蒂芬·拉瓦维(Stephan T.Lavavej,STL也知道)的版本,他最初提议将此函数添加到C++14中
#include <cstddef>
#include <memory>
#include <type_traits>
#include <utility>
namespace std {
template<class T> struct _Unique_if {
typedef unique_ptr<T> _Single_object;
};
template<class T> struct _Unique_if<T[]> {
typedef unique_ptr<T[]> _Unknown_bound;
};
template<class T, size_t N> struct _Unique_if<T[N]> {
typedef void _Known_bound;
};
template<class T, class... Args>
typename _Unique_if<T>::_Single_object
make_unique(Args&&... args) {
return unique_ptr<T>(new T(std::forward<Args>(args)...));
}
template<class T>
typename _Unique_if<T>::_Unknown_bound
make_unique(size_t n) {
typedef typename remove_extent<T>::type U;
return unique_ptr<T>(new U[n]());
}
template<class T, class... Args>
typename _Unique_if<T>::_Known_bound
make_unique(Args&&...) = delete;
}
#包括
#包括
#包括
#包括
名称空间标准{
模板结构\u唯一\u如果{
typedef unique_ptr_Single_object;
};
模板结构\u唯一\u如果{
typedef unique_ptr_Unknown_bound;
};
模板结构\u唯一\u如果{
typedef void_Known_bound;
};
模板
typename\u唯一\u如果::\u单个\u对象
使_唯一(Args&&…Args){
返回唯一的ptr(新T(标准::转发标准修订版复制自(中给出了相同内容)
模板
std::unique_ptr使_唯一(Args&&…Args)
{
返回std::unique_ptr(新的T(std::forward
不过,如果中的解决方案与您的编译器一起编译,我会选择该解决方案。这一解决方案更复杂,也适用于数组。可能重复@BenJackson,目的是在正确使用make\u unique
时,永远不会与\u Known\u bound
版本匹配。如果有人试图将其用作<代码> MaxuUngy()/>代码>它将匹配<代码>知识No.[/COD>版本]并导致错误。什么是将这个定义包含在C++代码中的一种好方法,它最终可以在一个MaSTa独特的环境中编译,在STDC++?@和AdReSyyAkoNoLUS中,我建议,如果是,Y-CPLUS PLUS==201103L……(请参见本章末尾附近的uuu cplusplus条目)请注意,我们不允许像这样将内容放入std::中。如果我必须添加make_unique
,我宁愿使用我自己的实用程序名称空间。你可以检查u cplusplus版本以避免问题。为什么点会超出args括号?这对我来说太违反直觉了!@Apollys如果我正确理解你的问题:那会将参数扩展到std::forward
,而不是T
(可能我误解了你的问题)。可能这就是我要问的,我对…
语法知之甚少,只知道我在示例中看到的。我觉得奇怪的是std::forward(args)行中的内容似乎<>代码> ARGs现在,每个参数都是单独的,而在顶部,它意味着所有的参数都是一个单元。@ AppOyyyYes,C++是一种奇怪的语言,充满了这样的怪癖。(当调用<代码> MaMaIOX < <代码> >创建一个数组类型,如<代码>无符号字符[A]时,这将不起作用。
并生成错误消息分配不完整类型
。
template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}