⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parenthesized_type.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
// Copyright David Abrahams 2006. Distributed under the Boost// Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP# define BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP# include <boost/config.hpp># include <boost/detail/workaround.hpp>namespace boost { namespace parameter { namespace aux { // A macro that takes a parenthesized C++ type name (T) and transforms// it into an un-parenthesized type expression equivalent to T.#  define BOOST_PARAMETER_PARENTHESIZED_TYPE(x)                    \    boost::parameter::aux::unaryfunptr_arg_type< void(*)x >::type// A metafunction that transforms void(*)(T) -> Ttemplate <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.0template<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;};# endiftemplate <>struct unaryfunptr_arg_type<void(*)(void)>{    typedef void type;};    }}} // namespace boost::parameter::aux#endif // BOOST_PARAMETER_AUX_PARENTHESIZED_TYPE_DWA2006414_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -