有没有办法重载operator =以使右侧的函数具有特定的行为

时间:2013-05-13 05:54:38

标签: c++ operator-overloading

我有一个名为Image的类,我希望非成员函数返回Image

Image::Image(const char * src);
Image::Image& operator= (const Image& p);
Image requestImg(std::string filename); //not a member function

我这样使用它:

Image p = requestImg("grass.png");

这很好,但是 - 我希望能够requestImg生成一个线程,将一个图像加载到Image对象(p)中,同时修改该对象的状态为loading=true

换句话说。

Image p = requestImg("grass.png");  //image is loading
std::cout << p.loading << std::endl; //true
//some time passes
std::cout << p.loading << std::endl; //false

p最初不能将加载设置为true,因为它不会加载并且不会导致合理的命名。我意识到使用成员函数,这将更容易 - 甚至传递指向函数的指针,但有没有办法按照我的布局做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以保留Image,并使用std::async,这会为您提供std::future<Image>。您可以决定何时需要结果:

#include <future>

auto p = std::async(std::launch::async, &requestImg,"grass.png"); // load image asynchronously
//some time passes
// do other work

// now we really need the image
auto img = p.get(); // blocking call, requires async call to be done loading image.

答案 1 :(得分:1)

以下是我用来实现此目的的一般代码(我很接近,但我们可以称之为解决)。它使用临时futureImage来处理未来,并使用 copy 构造函数重载来创建新线程并在将来填充this ....这是类型:

class Image {
private:
        std::future<Image> * futureImage; //just a temporary for threading
        void threadingwork(); //this takes futureimage and sets values of self once it finishes
    public:
        Image(std::future<Image> p); //this sets loading = true, and sets the future + creates a thread which calls threadingwork above
};

std::future<Image> requestImg(std::string filename);

现在:

Image p = requestImg("grass.png"); 

正确解析(并正确使用复制构造函数)。