gpt4 book ai didi

c++ - 指向用于绑定(bind)的友元运算符重载的函数指针

转载 作者:太空宇宙 更新时间:2023-11-04 15:22:58 24 4
gpt4 key购买 nike

最终目标如下:我希望能够使用 for_eachoperator<< .我意识到我可以使用 ostream_iterator但我想看看没有它是否可行。

一些示例代码,以便您了解我想做什么:

#include <algorithm>
#include <iostream>
#include <functional>
#include <vector>

using std::bind;
using std::ref;
using std::placeholders::_1;
using std::for_each;
using std::ostream;
using std::cout;
using std::endl;
using std::vector;

class C {
private:
int x;
public:
C() : x(0) { }
C(int x) : x(x) { }

friend ostream& operator<<(ostream& out, const C& c);
};

ostream& operator<<(ostream& out, const C& c) {
return out << c.x << endl;
}

int main() {
vector<C> v;
v.push_back(C(1));
v.push_back(C());

for_each(v.begin(), v.end(), bind(&ostream::operator<<, ref(cout), _1));

return 0;
}

我尝试失败的一件事(上图):

bind(static_cast<ostream& (ostream::*)(ostream&, const C&)>(&ostream::operator<<), ref(cout), _1)

最佳答案

您指定了错误的 operator<< ;你指定了 ostream::operator<< ,但是你的 operator<<是免费的,即 ::operator<< .

这适用于您当前的程序:

for_each(v.begin(), v.end(), bind(&::operator<<, ref(cout), _1));

但是,如果您添加更多免费 operator<< s 那么它将再次失败,因为 bind无法决定哪个operator<<是指。在这种情况下,您必须通过显式特化来指定:

for_each(v.begin(), v.end(), bind<ostream&(*)(ostream&, const C&)>(&::operator<<, ref(cout), _1));

等效地,您可以使用 static_cast<ostream&(*)(ostream&, const C&)>(&::operator<<) .

问题是 <<std::cout << c可以是免费运营商或成员(member)运营商,并且没有办法先验地知道是哪一个。 ostream_iterator通过生成允许编译器决定如何评估表达式的代码来工作;同样,如果您使用 lambda 或仅使用范围 for 循环。

关于c++ - 指向用于绑定(bind)的友元运算符重载的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882845/

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