gpt4 book ai didi

c++ - 使用 std::thread 调用重载的成员函数

转载 作者:可可西里 更新时间:2023-11-01 15:37:39 37 4
gpt4 key购买 nike

是否可以重载我们需要使用线程跨越的函数?

我有一个名为 Complex 的简单类。

class Complex
{
public:
Complex():realPart_(0), imagPart_(0){}

Complex(double rp, double ip) : realPart_(rp), imagPart_(ip) {}

double & real() { return realPart_;}
double & imag() { return imagPart_;}

const double & real() const { return realPart_;}
const double & imag() const { return imagPart_;}

double square() const {return realPart_*realPart_ - imagPart_*imagPart_;}

void display() const
{
std::cout << "Square of the Complex number (" << realPart_ << ") + i (" << imagPart_ << " ) is " << square() << std::endl;
}

void display(unsigned nTimes) const {while(nTimes-- > 0)display();}

private:

double realPart_;
double imagPart_;

};

void Test3()
{
Complex c1(1, 0.74), c2(2, 0.35);

std::thread sqCalc1(&Complex::display, &c1);
std::thread sqCalc2(&Complex::display, &c2);

sqCalc1.join();
sqCalc2.join();
}

我在构建这段代码时遇到错误。

error C2661: 'std::thread::thread' : no overloaded function takes 2 arguments

如果没有采用无符号的重载显示函数,那么我显示的代码可以正常工作。

最佳答案

问题与 std::thread 无关(该错误具有误导性),重新排列代码可以证明这一点:

auto memfunc = &Complex::display;
std::thread sqCalc1(memfunc, &c1);
std::thread sqCalc2(memfunc, &c2);

错误现在将出现在第一行,因为正如其他答案所说,表达式 &Complex::display 指的是一个重载函数,编译器不知道你指的是哪个。

您可以通过强制转换或类似这样的方式告诉编译器您尝试调用的函数的类型来选择所需的重载:

void (Complex::*memfunc)() const = &Complex::display;
std::thread sqCalc1(memfunc, &c1);
std::thread sqCalc2(memfunc, &c2);

现在您已明确请求返回 void 且不带任何参数的 display 重载。

如果您的编译器支持 C++11 别名声明,您可以使其更易于阅读:

using memfunc_type = void (Complex::*)() const;
memfunc_type memfunc = &Complex::display;
std::thread sqCalc1(memfunc, &c1);
std::thread sqCalc2(memfunc, &c2);

关于c++ - 使用 std::thread 调用重载的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276425/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com