From e4e6d59a35ed44e281dff5b82dd9dfc1797eaf1e Mon Sep 17 00:00:00 2001 From: mat007 Date: Sat, 21 Dec 2013 18:20:49 +0000 Subject: [PATCH] Improved workaround for the template method limitation git-svn-id: https://svn.code.sf.net/p/turtle/code/trunk@702 860be788-9bd5-4423-9f1e-828f051e677b --- .../example/limitations_template_method.cpp | 58 ++++++++++++++++--- build/boost/doc/limitations.qbk | 10 +++- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/build/boost/doc/example/limitations_template_method.cpp b/build/boost/doc/example/limitations_template_method.cpp index 70659a6..3cf9035 100644 --- a/build/boost/doc/example/limitations_template_method.cpp +++ b/build/boost/doc/example/limitations_template_method.cpp @@ -2,6 +2,8 @@ #include #include +namespace limitations_template_method_problem +{ //[ limitations_template_method_problem class concept { @@ -12,15 +14,11 @@ public: }; template< typename T > -class client +void function_under_test( T t ) // T is supposed to model the previous concept { -public: - client( T t ) // T is supposed to model the previous concept - { - t.method( 42 ); - t.method( "string" ); - } -}; + t.method( 42 ); + t.method( "string" ); +} //] //[ limitations_template_method_solution @@ -30,4 +28,48 @@ MOCK_CLASS( mock_concept ) MOCK_METHOD( method, 1, void( const char* ), method_string ) }; //] +} +namespace limitations_template_method_problem_2 +{ +//[ limitations_template_method_problem_2 +class concept +{ +public: + template< typename T > + T create() + { + return T(); + } +}; + +template< typename T > +void function_under_test( T t ) // T is supposed to model the previous concept +{ + t.create< int >(); + t.create< std::string >(); +} +//] + +//[ limitations_template_method_solution_2 +MOCK_CLASS( mock_concept ) +{ + template< typename T > + T create(); + + template<> + int create< int >() + { + return create_int(); + } + template<> + std::string create< std::string >() + { + return create_string(); + } + + MOCK_METHOD( create_int, 0, int(), create_int ) + MOCK_METHOD( create_string, 0, std::string(), create_string ) +}; +//] +} diff --git a/build/boost/doc/limitations.qbk b/build/boost/doc/limitations.qbk index b5d93ca..b7fde29 100644 --- a/build/boost/doc/limitations.qbk +++ b/build/boost/doc/limitations.qbk @@ -56,7 +56,15 @@ writing a mock object modeling 'concept' requires to list all the possible versi [limitations_template_method_solution] -While still somewhat possible, mocking a template method is indeed a bit cumbersome. +However if one or more template parameters must be explicitly specified as in : + +[limitations_template_method_problem_2] + +delegate methods must be manually added : + +[limitations_template_method_solution_2] + +While still somewhat possible, mocking a template method can indeed prove a bit cumbersome. [endsect]