fork download
  1. #include <functional>
  2. #include <iostream>
  3.  
  4. struct foo {
  5. foo* m_objID;
  6. foo() : m_objID(this) { }
  7.  
  8. double operator()(int a, long b) { return a + b; }
  9.  
  10. /// 等値演算子☆彡
  11. bool operator==(const foo& rhs) {
  12. std::cout << __FUNCTION__ << ": this->m_objID=" << m_objID << ", rhs.m_objID=" << rhs.m_objID << std::endl;
  13. return (this->m_objID == rhs.m_objID);
  14. }
  15. };
  16.  
  17. int main(void) {
  18. foo quuux;
  19. foo quuuux;
  20. std::function<double(int, long)> gfred = quuux;
  21.  
  22. std::cout << "value=" << (*gfred.target<foo>())(10, 200L) << std::endl; // "value=210" と表示される(意図通りイゴイタ
  23.  
  24. if (&*gfred.target<foo>() == &quuux) {
  25. std::cout << "gfred is quuux" << std::endl; // 表示されない
  26. }
  27. if (*gfred.target<foo>() == quuux) {
  28. std::cout << "gfred equals quuux" << std::endl; // "gfred equals quuux" と表示される(ようになた
  29. }
  30. if (*gfred.target<foo>() == quuuux) {
  31. std::cout << "gfred equals quuuux" << std::endl; // 表示されない
  32. }
  33.  
  34. // 等値演算子☆彡のテスト
  35. // 以下の結果を見る限り、等値演算子☆彡自体は正しく動いている。
  36. if (quuux == quuux) {
  37. std::cout << "quuux == quuux" << std::endl; // "quuux == quuux" と表示される
  38. }
  39. if (quuux == quuuux) {
  40. std::cout << "quuux == quuuux" << std::endl; // 表示されない
  41. }
  42. }
  43.  
Success #stdin #stdout 0.01s 5332KB
stdin
Standard input is empty
stdout
value=210
operator==: this->m_objID=0x7fff039906a0, rhs.m_objID=0x7fff039906a0
gfred equals quuux
operator==: this->m_objID=0x7fff039906a0, rhs.m_objID=0x7fff039906a8
operator==: this->m_objID=0x7fff039906a0, rhs.m_objID=0x7fff039906a0
quuux == quuux
operator==: this->m_objID=0x7fff039906a0, rhs.m_objID=0x7fff039906a8