on 17.08.2009 at 17:54 joel wrote :
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 there is no performance degradation
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 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