小编Toc*_*cio的帖子

shared_ptr存储删除器如何?

我无法理解如何shared_ptr存储我给它的删除器.

最初,使用a shared_ptr<int>,我认为它可能会使用a std::function<void(int*)>,但我可以作为删除器给出任何类型的函数(或可调用对象),只要第一个参数是a int*.

怎么shared_ptr办呢?

我很抱歉,如果这是一个愚蠢的问题,我是C++的新手,请原谅我!

编辑:问题是:我怎么能做那样的事情?我该怎么用?任何例子?或者这是一个非常高级的话题?

c++ generics function shared-ptr

8
推荐指数
2
解决办法
498
查看次数

C++ - 使用好友关键字来提高效率?

例如,我有这两个类(来自C++ Primer的练习):

class Message{
   set<Folder> folders;
public:
   void addFolder(Folder f);
}

class Folder{
   set<Message> messages;
public:
   void addMessage(Message m);
}
Run Code Online (Sandbox Code Playgroud)

方法addFolder(等于addMessage)是这样的:

void addFolder(Folder f){
    folders.push_back(f);
    f.addMessage(this);
}

void addMessage(Message m){
    messages.push_back(m);
    m.addFolder(this);
}
Run Code Online (Sandbox Code Playgroud)

问题是这样我将对这两个方法进行无限递归调用(文件夹添加消息,而不是消息添加文件夹并要求文件夹添加消息等).

我有两个解决方案:

1.在每个返回bool的类中有一个公共成员,该值表示给定的消息/文件夹是否在对象的集合中:

void addFolder(Folder f){
    folders.push_back(f);
    if(!f.search(this)){
       f.addMessage(this);
    }
}

void addMessage(Message m){
    messages.push_back(m);
    if(!m.search(this)){
        m.addFolder(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

这应该工作,但每次我必须控制该设置两次.

另一个解决方案是在每个类中都有一个私有成员,只添加文件夹/消息而不要求另一个添加它.然后把它交给班级朋友.

class Message{
   friend class Folder;
   set<Folder> folders;
public:
   void  addFolder(Folder f);
private:
   void insertFolder(Folder f){ folders.push_back(f);}
}

class Folder{
   friend class Message;
   set<Message> messages;
public:
   void …
Run Code Online (Sandbox Code Playgroud)

c++ performance friend

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

将右值引用绑定到右值引用?

我试图编译:

int &&a=3;
int &b=a;
Run Code Online (Sandbox Code Playgroud)

它的工作原理.我知道"a"是一个左值,但为什么我可以将"rvalue to int"绑定到"对int的lvalue引用(而不是对int的rvalue引用)"?这样,我可以改变临时值,3:

b=5 //changing the value of the temporary bound to the rvalue reference
Run Code Online (Sandbox Code Playgroud)

这个tecnique用于std :: forward,所以我认为这是一个标准的行为.对int的rvalue引用是否被视为存储临时的简单int左值?如果没有,你如何解释绑定?

c++ reference forward rvalue lvalue

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

构造的临时对象是左值?

假设我有一个名为Foo的类,带有复制赋值运算符,我认为这样:

Foo() = Foo();
Run Code Online (Sandbox Code Playgroud)

是不被允许的,因为我认为(对不起,再次)Foo()是一个右值(所以我不能分配给它),是一个临时对象.显然,我试图使这个代码工作,它正常工作,显示一些字符串,以验证我的程序正确使用复制赋值运算符.

我错了吗?或者这是一种错误?有什么用处?

c++ constructor temporary rvalue

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