#include <functional>
#include <iostream>
struct foo {
double operator()(int a, long b) { return a + b; }
/// 等値演算子☆彡
bool operator==(const foo& rhs) {
std::cout << __FUNCTION__ << ": this=" << this << ", &rhs=" << &rhs << std::endl;
return (this == &rhs);
}
};
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+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBmb28gewoJZG91YmxlIG9wZXJhdG9yKCkoaW50IGEsIGxvbmcgYikgeyByZXR1cm4gYSArIGI7IH0KCgkvLy8g562J5YCk5ryU566X5a2Q4piG5b2hCglib29sIG9wZXJhdG9yPT0oY29uc3QgZm9vJiByaHMpIHsKCQlzdGQ6OmNvdXQgPDwgX19GVU5DVElPTl9fIDw8ICI6IHRoaXM9IiA8PCB0aGlzIDw8ICIsICZyaHM9IiA8PCAmcmhzIDw8IHN0ZDo6ZW5kbDsKCQlyZXR1cm4gKHRoaXMgPT0gJnJocyk7Cgl9Cn07CgppbnQgbWFpbih2b2lkKSB7Cglmb28gcXV1dXg7Cglmb28gcXV1dXV4OwoJc3RkOjpmdW5jdGlvbjxkb3VibGUoaW50LCBsb25nKT4gZ2ZyZWQgPSBxdXV1eDsKCglzdGQ6OmNvdXQgPDwgInZhbHVlPSIgPDwgKCpnZnJlZC50YXJnZXQ8Zm9vPigpKSgxMCwgMjAwTCkgPDwgc3RkOjplbmRsOwkJLy8gInZhbHVlPTIxMCIg44Go6KGo56S644GV44KM44KLKOaEj+Wbs+mAmuOCiu+9su+9uu++nu+9su++gAoKCWlmICgmKmdmcmVkLnRhcmdldDxmb28+KCkgPT0gJnF1dXV4KSB7CgkJc3RkOjpjb3V0IDw8ICJnZnJlZCBpcyBxdXV1eCIgPDwgc3RkOjplbmRsOwkJCS8vIOihqOekuuOBleOCjOOBquOBhAoJfQoJaWYgKCpnZnJlZC50YXJnZXQ8Zm9vPigpID09IHF1dXV4KSB7CgkJc3RkOjpjb3V0IDw8ICJnZnJlZCBlcXVhbHMgcXV1dXgiIDw8IHN0ZDo6ZW5kbDsJCS8vICJnZnJlZCBlcXVhbHMgcXV1dXgiIOOBqOihqOekuuOBleOCjOOBpuassuOBl+OBhOOBjOOBleOCjOOBquOBhAoJfQoJaWYgKCpnZnJlZC50YXJnZXQ8Zm9vPigpID09IHF1dXV1eCkgewoJCXN0ZDo6Y291dCA8PCAiZ2ZyZWQgZXF1YWxzIHF1dXV1eCIgPDwgc3RkOjplbmRsOwkvLyDooajnpLrjgZXjgozjgarjgYQKCX0KCgkvLyDnrYnlgKTmvJTnrpflrZDimIblvaHjga7jg4bjgrnjg4gKCS8vIOS7peS4i+OBrue1kOaenOOCkuimi+OCi+mZkOOCiuOAgeetieWApOa8lOeul+WtkOKYhuW9oeiHquS9k+OBr+ato+OBl+OBj+WLleOBhOOBpuOBhOOCi+OAggoJaWYgKHF1dXV4ID09IHF1dXV4KSB7CgkJc3RkOjpjb3V0IDw8ICJxdXV1eCA9PSBxdXV1eCIgPDwgc3RkOjplbmRsOwkJCS8vICJxdXV1eCA9PSBxdXV1eCIg44Go6KGo56S644GV44KM44KLCgl9CglpZiAocXV1dXggPT0gcXV1dXV4KSB7CgkJc3RkOjpjb3V0IDw8ICJxdXV1eCA9PSBxdXV1dXgiIDw8IHN0ZDo6ZW5kbDsJCS8vIOihqOekuuOBleOCjOOBquOBhAoJfQp9Cg==