Hacker News new | ask | show | jobs
by deckar01 2663 days ago
I don't understand why the class instance needs to accept the interaction. Why not just invoke the interaction directly?

    interactor_p->interact(thingy_p)
Would this still be considered the visitor pattern or is the extra layer of indirection important?
2 comments

Your code won't compile because interactor::interact is not defined on the base class. That line is needed because the overload resolution is static. So with the macro ACCEPTS, you build the code where the overload is resolved.
I see. There is no interact signature that accepts IThingy, which is the whole point of this pattern. Thanks.
I don't know about the limitations of C++, but something like what you describe would happen in Smalltalk. Take for example a Canvas object and a bunch of different shape objects (square, circle, etc):

  "Square class"
  drawOn: aCanvas
      aCanvas line: (some point) to: (some point).
      "etc"
  
  "Triangle class"
  drawOn: aCanvas
      aCanvas line: self leftVertex to: self rightVertex.
      "etc"

  "Canvas class"
  drawShapes: aCollection
      aCollection do: [ :shape |
          shape drawOn: self ]