
First, concrete inheritance like this == bad performances. Use CRTP I'm against the proliferation of such types cause it'll just pollute and clutter the namespace when a simple policy things is easy to do and have same set of features. first, it does use crtp i omitted template parameters for simplicity
And anyway, your exampel is faulty, you should ask your user to wait for any type T that is a matrix expression with symmetric features or when you'll call f( a+b*c ); you'll get spurious copy. so the actual generic way to write this should be : template<class T> typename enable_if_c< as_matrix<T>::value && is_same< settings<T,shape>,symmetric>>::value >::type f( T const& m ); but we can't have user write that so a small macro thingy will be needed. actually since symmetric_matrix uses crtp the user gets just what he
on 17.08.2009 at 17:54 joel wrote : there is no performance degradation probably wants if you supply an actual object it will be passed by reference otherwise the result of an expression will be copied to a temporary and that temorary will be passed by reference (probably that's just what the user needs) finally if the user is advanced, he may write template<typename expression_type> void foo(const symmetric_matrix_expression<expression_type> &m); perfectly readable, typesafe, excellent performance, easy to understand and implement
You should read and learn about : SFINAE ,boost::enable_if and BOOST_MPL_ASSERT. That's ages that cryptic error messages int empalte are no more. just this moment there is a discussion about enable_if issues you might be interested
-- Pavel