It seems another religion war has started between template fans ("Wrap, Wrap, Wrap") and virtual functions fans ("Derive, Derive, Derive").
If I want and obje that is A-able, B-able and C-Able I can:
The two logic are in fact "dual": in 1. first I define what my data should be, and then I associate functionality by wrapping around, in 2 I inherit the functionaliy and then define what they are for.
Polimorphism in 1 is based on static_cast and in 2 is based on virtual functions, RTTI and dynamic_cast.
What I don't like is certain sometime "intergralistic" approach: open source must be "template" (because they are source) and "closed source" must be "library" and inheritance (because thay can be compiled separately).
What sometime is forgotten is the "efficency of the process": if everything is in headres, all compiling happens in one place and all symbols must be known to the compiler (and - eventually - skipped because not referenced)
On the other side, if everything is in library, compiling is quite simple and fast, but linking is more difficult. And is the linker to skip the unused code.
In other therm, 1. is heavy for the compilers, 2. is heavy for the linker.
The optimization is probably a balance between the two approaches.
If I want and obje that is A-able, B-able and C-Able I can:
- Create CMyClass and then wap it into A<T>, B<T>, C<T> (and eventually specialize some of them)
- Create interface IA, IB and IC, implement as CAimpl, CBimpl and CCimpl and then derive CMyclass from CAimpl, CBimpl, CCimpl (or directly fom IA, IB and IC if I want another specific implementation)
The two logic are in fact "dual": in 1. first I define what my data should be, and then I associate functionality by wrapping around, in 2 I inherit the functionaliy and then define what they are for.
Polimorphism in 1 is based on static_cast and in 2 is based on virtual functions, RTTI and dynamic_cast.
What I don't like is certain sometime "intergralistic" approach: open source must be "template" (because they are source) and "closed source" must be "library" and inheritance (because thay can be compiled separately).
What sometime is forgotten is the "efficency of the process": if everything is in headres, all compiling happens in one place and all symbols must be known to the compiler (and - eventually - skipped because not referenced)
On the other side, if everything is in library, compiling is quite simple and fast, but linking is more difficult. And is the linker to skip the unused code.
In other therm, 1. is heavy for the compilers, 2. is heavy for the linker.
The optimization is probably a balance between the two approaches.