我问了最初的问题before。现在我有一个后续问题。这是代码:
using namespace std::placeholders;
using namespace std;
struct MyType {};
struct MyType2 {};
ostream& operator<<(ostream &os, const MyType &n)
{
cout << "MyType" << endl;
return os;
}
ostream& operator<<(ostream &os, const MyType2 &n)
{
cout << "MyType2" << endl;
return os;
}
int main()
{
std::vector<MyType> vec;
MyType mt;
vec.push_back(mt);
std::for_each(vec.begin(), vec.end(), [](const MyType &mt) {cout << mt;}); // this works
std::for_each(vec.begin(), vec.end(), std::bind((ostream&(ostream&, const MyType&))::operator<<, std::ref(std::cout), _1)); // this does nothing !
return 0;
}
你知道为什么lambda工作而bind绑定实现什么都不做?它编译,但什么都不做。
答案 0 :(得分:2)
演员表无效,您需要转换为参考
static_cast<ostream&(&)(ostream&, const MyType&)>(::operator<<)
或指针
static_cast<ostream&(*)(ostream&, const MyType&)>(&::operator<<)
两者都适用于std::bind
。
请注意,您的原始代码被Coliru的GCC 4.8拒绝。
答案 1 :(得分:1)
您的代码无法在gcc-4.8上编译,它会抱怨函数类型无效。 clang确实编译了代码,但什么也没做,不知道那里发生了什么。无论如何,你必须转换为函数指针类型,而不是函数类型。
std::for_each(vec.begin(), vec.end(), std::bind((ostream&(*)(ostream&, const MyType&))::operator<<, std::ref(std::cout), _1));
// ^^^
或者更好的是,失去C风格的演员阵容并使用static_cast
代替
std::for_each(vec.begin(), vec.end(),
std::bind(static_cast<ostream&(*)(ostream&, const MyType&)>(::operator<<), std::ref(std::cout), _1));