diff options
Diffstat (limited to 'boost/parameter/aux_/parenthesized_type.hpp')
-rw-r--r--[-rwxr-xr-x] | boost/parameter/aux_/parenthesized_type.hpp | 84 |
1 files changed, 0 insertions, 84 deletions
diff --git a/boost/parameter/aux_/parenthesized_type.hpp b/boost/parameter/aux_/parenthesized_type.hpp index c6ddd77f31..69e7a237d4 100755..100644 --- a/boost/parameter/aux_/parenthesized_type.hpp +++ b/boost/parameter/aux_/parenthesized_type.hpp @@ -18,96 +18,12 @@ namespace boost { namespace parameter { namespace aux { template <class UnaryFunctionPointer> struct unaryfunptr_arg_type; -# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) - template <class Arg> struct unaryfunptr_arg_type<void(*)(Arg)> { typedef Arg type; }; -# else - -// Use the "native typeof" bugfeatures of older versions of MSVC to -// accomplish what we'd normally do with partial specialization. This -// capability was discovered by Igor Chesnokov. - -# if BOOST_WORKAROUND(BOOST_MSVC, != 1300) - -// This version applies to VC6.5 and VC7.1 (except that we can just -// use partial specialization for the latter in this case). - -// This gets used as a base class. -template<typename Address> -struct msvc_type_memory -{ - // A nullary metafunction that will yield the Value type "stored" - // at this Address. - struct storage; -}; - -template<typename Value, typename Address> -struct msvc_store_type : msvc_type_memory<Address> -{ - // VC++ somehow lets us define the base's nested storage - // metafunction here, where we have the Value type we'd like to - // "store" in it. Later we can come back to the base class and - // extract the "stored type." - typedef msvc_type_memory<Address> location; - struct location::storage - { - typedef Value type; - }; -}; - -# else - -// This slightly more complicated version of the same thing is -// required for msvc-7.0 -template<typename Address> -struct msvc_type_memory -{ - template<bool> - struct storage_impl; - - typedef storage_impl<true> storage; -}; - -template<typename Value, typename Address> -struct msvc_store_type : msvc_type_memory<Address> -{ - // Rather than supplying a definition for the base class' nested - // class, we specialize the base class' nested template - template<> - struct storage_impl<true> - { - typedef Value type; - }; -}; - -# endif - -// Function template argument deduction does many of the same things -// as type matching during partial specialization, so we call a -// function template to "store" T into the type memory addressed by -// void(*)(T). -template <class T> -msvc_store_type<T,void(*)(T)> -msvc_store_argument_type(void(*)(T)); - -template <class FunctionPointer> -struct unaryfunptr_arg_type -{ - // We don't want the function to be evaluated, just instantiated, - // so protect it inside of sizeof. - enum { dummy = sizeof(msvc_store_argument_type((FunctionPointer)0)) }; - - // Now pull the type out of the instantiated base class - typedef typename msvc_type_memory<FunctionPointer>::storage::type type; -}; - -# endif - template <> struct unaryfunptr_arg_type<void(*)(void)> { |