双方unique_ptr
并shared_ptr
接受定制的析构函数他们所拥有的对象上调用.但在的情况下unique_ptr
,析构函数作为一个模板参数传递类,而类型shared_ptr
的自定义析构函数将被指定为一个模板参数的构造函数.
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
Run Code Online (Sandbox Code Playgroud)
和
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会有这样的差异.需要什么?
//------------------------------------------------------------------------------
struct A
{
A(){}
A(A&&){}
A& operator=(A&&){return *this;}
void operator()(){}
private:
A(const A&);
A& operator=(const A&);
int x;
};
//------------------------------------------------------------------------------
int main()
{
A a;
std::function<void()> func(std::move(a));
}
Run Code Online (Sandbox Code Playgroud)
'A :: A':无法访问类'A'中声明的私有成员
似乎当我通过引用捕获某些东西时,或者const
我可以制作一个不可复制的lambda.但是,当我这样做时,它实际上是为了给它一个std::function
.
我有一张代表配置的地图.这是地图std::string
和boost::any
.
此映射在开始时初始化,我希望用户能够在命令行上覆盖这些选项.
我喜欢做的是使用该options_description::add_option()
方法从此地图构建程序选项.但是,它需要一个模板参数,po::value<>
而我只有boost::any
.
到目前为止,我只是拥有代码的shell. m_Config
代表我的配置类,并getTuples()
返回一个std::map<std::string, Tuple>
. TuplePair
是一个typedef std::pair<std::string, Tuple>
和Tuple包含boost::any
我感兴趣的.
po::options_description desc;
std::for_each(m_Config.getTuples().begin(),
m_Config.getTuples().end(),
[&desc](const TuplePair& _pair)
{
// what goes here? :)
// desc.add_options() ( _pair.first, po::value<???>, "");
});
Run Code Online (Sandbox Code Playgroud)
有没有办法以这种方式构建它,还是我需要自己去做?
提前致谢!
我无法理解如何shared_ptr
存储我给它的删除器.
最初,使用a shared_ptr<int>
,我认为它可能会使用a std::function<void(int*)>
,但我可以作为删除器给出任何类型的函数(或可调用对象),只要第一个参数是a int*
.
怎么shared_ptr
办呢?
我很抱歉,如果这是一个愚蠢的问题,我是C++的新手,请原谅我!
编辑:问题是:我怎么能做那样的事情?我该怎么用?任何例子?或者这是一个非常高级的话题?
c++ ×4
c++11 ×2
function ×2
shared-ptr ×2
boost-any ×1
generics ×1
lambda ×1
std ×1
unique-ptr ×1