
From: "Andy Little" <andy@servocomm.freeserve.co.uk>
But is it the flexibility that se wants.
^^ I try to use "s/he" for that. "se" just looks like a typo.
#include <iostream> template< typename A , typename B > struct multiply_traits;
// use traits template< typename A , typename B > struct multiply1{
typedef multiply_traits<A,B> traits; typename traits::result_type operator () (typename traits::first_argument_type a, typename traits::second_argument_type b) { return a * b; }
};
template< typename A, typename B > class multiply1 { typedef multiply_traits<A,B> traits; public: typedef typename traits::result_type result_type; typedef typename traits::first_argument_type first_argument_type; typedef typename traits::second_argument_type second_argument_type; result_type operator()(first_argument_type a, second_argument_type b) { return a * b; } };
//use policy template< typename A , typename B, typename Policy> struct multiply2{
typename Policy::result_type operator () (typename Policy::first_argument_type a, typename Policy::second_argument_type b) { return a * b; }
// or Policy ()(a,b); etc if ---> policy
};
template< typename A, typename B, class Policy > struct multiply2 : Policy { };
template<typename T> struct multiply_traits<T,T>{ typedef T result_type; typedef T first_argument_type; typedef T second_argument_type; //operator()(a,b) etc if --->policy };
int main() { multiply1<int,int>::traits::result_type val1
multiply1<int,int>::result_type val1
= multiply1<int,int>()(10,10); std::cout << val1 <<'\n';
multiply_traits<int,int>::result_type val2 = multiply2<int,int,multiply_traits<int,int> >()(10,10);
typedef multiply2< int, int, multiply_traits< int, int > > m2; m2::result_type val2(m2()(10, 10));
std::cout << val2 <<'\n'; }
-- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;