On Tuesday, 9 June 2015 at 14:05:40 UTC, Ola Fosheim Grøstad
wrote:
One of the arguments for having separate declarations and
definitions in C++ is that it provides better encapsulation
(which C++ breaks for templates and inlined methods).
If you have full encapsulation you know that the declaration
holds. So "x.print()" means that the declaration for the type
of x includes "print()".
Well, if you have full encapsulation, then you don't have
extension methods and consequently don't have this issue.
True, but you can always wrap code in interfacing-references. I
use this deliberately in multi-threaded code, so that I avoid
calling the wrong methods on the wrong thread. E.g.
"multithreaded(someobject).clear()" and
"singlethreaded(someobject).clear()".
This doesn't look like full encapsulation if the type behavior is
extended this way.