Simply passing the indices on to the engine object may seem odd. There are several advantages to this extra level of indirection. As a result, Array has a wide variety of constructors for user convenience, while engines have but a few. Engines support indexing only. Array does not have direct access to the data, which is managed by the engine object.
Engines have no such support.
In general, Array is much more complex and feature-laden than Engine . Engines are simple enough to be written by users and plugged directly into the Array framework. First, there is the general Engine template, which is empty as there is no default behavior for an unknown EngineTag . The general template is therefore not a model for the Engine concept and Array classes attempting to use it will not compile. Next, there is the definition of the Brick class, a policy tag whose sole purpose is to select a particular specialization of the Engine template.