#include <functional>
#include <iostream>
struct foo {
foo* m_objID;
foo() : m_objID(this) { }
double operator()(int a, long b) { return a + b; }
/// 等値演算子☆彡
bool operator==(const foo& rhs) {
std::cout << __FUNCTION__ << ": this->m_objID=" << m_objID << ", rhs.m_objID=" << rhs.m_objID << std::endl;
return (this->m_objID == rhs.m_objID);
}
};
int main(void) {
foo quuux;
foo quuuux;
std::function<double(int, long)> gfred = quuux;
std::cout << "value=" << (*gfred.target<foo>())(10, 200L) << std::endl; // "value=210" と表示される(意図通りイゴイタ
if (&*gfred.target<foo>() == &quuux) {
std::cout << "gfred is quuux" << std::endl; // 表示されない
}
if (*gfred.target<foo>() == quuux) {
std::cout << "gfred equals quuux" << std::endl; // "gfred equals quuux" と表示される(ようになた
}
if (*gfred.target<foo>() == quuuux) {
std::cout << "gfred equals quuuux" << std::endl; // 表示されない
}
// 等値演算子☆彡のテスト
// 以下の結果を見る限り、等値演算子☆彡自体は正しく動いている。
if (quuux == quuux) {
std::cout << "quuux == quuux" << std::endl; // "quuux == quuux" と表示される
}
if (quuux == quuuux) {
std::cout << "quuux == quuuux" << std::endl; // 表示されない
}
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBmb28gewoJZm9vKiBtX29iaklEOwoJZm9vKCkgOiBtX29iaklEKHRoaXMpIHsgfQoKCWRvdWJsZSBvcGVyYXRvcigpKGludCBhLCBsb25nIGIpIHsgcmV0dXJuIGEgKyBiOyB9CgoJLy8vIOetieWApOa8lOeul+WtkOKYhuW9oQoJYm9vbCBvcGVyYXRvcj09KGNvbnN0IGZvbyYgcmhzKSB7CgkJc3RkOjpjb3V0IDw8IF9fRlVOQ1RJT05fXyA8PCAiOiB0aGlzLT5tX29iaklEPSIgPDwgbV9vYmpJRCA8PCAiLCByaHMubV9vYmpJRD0iIDw8IHJocy5tX29iaklEIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gKHRoaXMtPm1fb2JqSUQgPT0gcmhzLm1fb2JqSUQpOwoJfQp9OwoKaW50IG1haW4odm9pZCkgewoJZm9vIHF1dXV4OwoJZm9vIHF1dXV1eDsKCXN0ZDo6ZnVuY3Rpb248ZG91YmxlKGludCwgbG9uZyk+IGdmcmVkID0gcXV1dXg7CgoJc3RkOjpjb3V0IDw8ICJ2YWx1ZT0iIDw8ICgqZ2ZyZWQudGFyZ2V0PGZvbz4oKSkoMTAsIDIwMEwpIDw8IHN0ZDo6ZW5kbDsJCS8vICJ2YWx1ZT0yMTAiIOOBqOihqOekuuOBleOCjOOCiyjmhI/lm7PpgJrjgorvvbLvvbrvvp7vvbLvvoAKCglpZiAoJipnZnJlZC50YXJnZXQ8Zm9vPigpID09ICZxdXV1eCkgewoJCXN0ZDo6Y291dCA8PCAiZ2ZyZWQgaXMgcXV1dXgiIDw8IHN0ZDo6ZW5kbDsJCQkvLyDooajnpLrjgZXjgozjgarjgYQKCX0KCWlmICgqZ2ZyZWQudGFyZ2V0PGZvbz4oKSA9PSBxdXV1eCkgewoJCXN0ZDo6Y291dCA8PCAiZ2ZyZWQgZXF1YWxzIHF1dXV4IiA8PCBzdGQ6OmVuZGw7CQkvLyAiZ2ZyZWQgZXF1YWxzIHF1dXV4IiDjgajooajnpLrjgZXjgozjgoso44KI44GG44Gr44Gq44GfCgl9CglpZiAoKmdmcmVkLnRhcmdldDxmb28+KCkgPT0gcXV1dXV4KSB7CgkJc3RkOjpjb3V0IDw8ICJnZnJlZCBlcXVhbHMgcXV1dXV4IiA8PCBzdGQ6OmVuZGw7CS8vIOihqOekuuOBleOCjOOBquOBhAoJfQoKCS8vIOetieWApOa8lOeul+WtkOKYhuW9oeOBruODhuOCueODiAoJLy8g5Lul5LiL44Gu57WQ5p6c44KS6KaL44KL6ZmQ44KK44CB562J5YCk5ryU566X5a2Q4piG5b2h6Ieq5L2T44Gv5q2j44GX44GP5YuV44GE44Gm44GE44KL44CCCglpZiAocXV1dXggPT0gcXV1dXgpIHsKCQlzdGQ6OmNvdXQgPDwgInF1dXV4ID09IHF1dXV4IiA8PCBzdGQ6OmVuZGw7CQkJLy8gInF1dXV4ID09IHF1dXV4IiDjgajooajnpLrjgZXjgozjgosKCX0KCWlmIChxdXV1eCA9PSBxdXV1dXgpIHsKCQlzdGQ6OmNvdXQgPDwgInF1dXV4ID09IHF1dXV1eCIgPDwgc3RkOjplbmRsOwkJLy8g6KGo56S644GV44KM44Gq44GECgl9Cn0K