相关疑难解决方法(0)

make_unique和完美的转发

为什么std::make_unique标准C++ 11库中没有函数模板?我发现

std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3));
Run Code Online (Sandbox Code Playgroud)

有点冗长.以下不是更好吗?

auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

这隐藏得new很好,只提到一次类型.

无论如何,这是我尝试实现make_unique:

template<typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
Run Code Online (Sandbox Code Playgroud)

我花了很std::forward长时间来编译这些东西,但我不确定它是否正确.是吗?究竟是什么std::forward<Args>(args)...意思?编译器对此做了什么?

c++ unique-ptr variadic-templates perfect-forwarding c++11

215
推荐指数
6
解决办法
7万
查看次数

用C++ 11重构

鉴于c ++许多程序员提供的新工具集,旨在实现代码简化,表达性,效率,浏览旧代码并进行调整(有些无意义,有些成功)以实现他们的目标.尽管不要在这些工作上浪费太多时间,只是做出非侵入性和自包含的变化,但最佳做法是什么?

让我勾勒出明显的:

  • 使用auto运行基于迭代器的循环:

    for (std::vector<foo>::const_iterator it(lala.begin()), ite(lala.end()); it != ite;     
    ++it);
    // becomes
    for (auto it(lala.cbegin()), ite(lala.cend()); it != ite; ++it);
    
    Run Code Online (Sandbox Code Playgroud)
  • 使用tie来进行多个赋值,这些赋值只产生C风格的代码行(如何一次将多个值分配到结构中?)

    a = 1;
    b = 2; 
    c = 3;
    d = 4; 
    e = 5;
    // becomes
    std::tie(a, b, c, d, e) = std::make_tuple(1, 2, 3, 4, 5);
    
    Run Code Online (Sandbox Code Playgroud)
  • 要使类不可继承,只需将其声明为"final"并删除实现此类行为的代码http://www.parashift.com/c++-faq/final-classes.html

  • 使用delete关键字显式隐藏构造函数/析构函数,而不是将它们声明为私有(例如,用于创建基于堆的对象的代码,不可复制的对象等)

  • 创建简单的仿函数只是为了将单个STL算法的执行变为lambda函数(除了减少代码混乱,你还能保证内联调用)

  • 仅使用智能指针简化对象的RAII包装

  • 摆脱bind1st,bind2nd只需使用bind

  • <type_traits>提供的标准代码替换类型特征的手写代码(Is_ptr_but_dont_call_for_const_ptrs <>等:))

  • 停止包含现在在STL中实现的函数的boost标头(BOOST_STATIC_ASSERT vs static_assert)

  • 为类提供移动语义(虽然这不符合脏/快/易更改的条件)

  • 在可能的情况下使用nullptr而不是NULL宏,并删除填充指针的容器的代码,其中0已转换为对象类型

    std::vector<foo*> …
    Run Code Online (Sandbox Code Playgroud)

c++ refactoring c++11

68
推荐指数
9
解决办法
5120
查看次数

将std :: make_unique与自定义删除器一起使用

在使用std::unique_ptr自定义删除器时,我希望使用std::make_unique而不是原始的新删除器.我正在使用VC++ 2013.在我看来,std::unique_ptr如果您使用自定义删除器,则无法使用.我错过了什么,或者这是真的吗?


附加信息:

我正在使用a std::unique_ptr<HANDLE, custom_deleter>来保存打开的COM端口的Windows HANDLE.

我可以为此编写一个自定义RAII类,它不会非常困难,但我看到它的使用难度/难度/难度std::unique_ptr.

c++ c++11 c++14

28
推荐指数
1
解决办法
2万
查看次数

我什么时候想从原始指针构造共享指针

感谢std::make_shared,我想知道,std::shared_ptr带有原始指针的构造函数是否具有任何值,除非与传统/库代码接口时,例如存储工厂的输出时.

  • 还有其他合法用例吗?
  • 避免使用构造函数是否合理?
  • 甚至对代码进行检查的范围是什么,它会在程序员使用它时发出警告?
  • 是否应该使用相同的指导方针(无论它们是什么)shared_ptr<T>::reset(T*)

关于代码检查:我知道与遗留/库代码的接口很常见,因此自动代码检查可能会有问题,但在目前为止我遇到的大多数情况下,我宁愿使用一个unique_ptr而且我也不是在谈论弹出的编译器警告-Wall,而不是代码审查期间静态代码分析的规则.


我的动机:
相对容易说"不要使用std::shared_ptr<T>(new T(...)),总是喜欢std::make_shared<T>(...)"(我认为这是正确的建议吗?).但是我想知道它是不是一般的设计气味,如果必须shared_ptr从原始指针创建一个,甚至 - 或者特别是 - 如果对象不是仅仅通过创建new,因为该对象应该被创建为首先是"共享"或"独特"的对象.

c++ shared-ptr c++11

17
推荐指数
3
解决办法
1313
查看次数

用于产生多态对象的函数的C ++返回类型?

据我了解,要传递/返回多态对象,您需要使用指针或引用类型以防止切片问题。但是,要从函数返回对象,则不能在堆栈上创建并返回引用,因为本地对象将不再存在。如果您在堆上创建并返回引用/指针,则调用者必须管理内存,效果不好。

考虑到以上几点,我将如何编写一个返回多态类型的函数?我将使用哪种返回机制/类型?

c++ polymorphism pointers memory-management virtual-functions

5
推荐指数
1
解决办法
1101
查看次数

如何将 make_unique 与 c++11 一起使用?

我收到以下错误:

“make_unique”不是“std”的成员

当它编写以下代码时:
std::make_unique()<Obj>(tmp)
我该如何修复它,使其在 c++11 中可以正常工作?

c++ unique-ptr

-1
推荐指数
1
解决办法
4257
查看次数