📄 signals_common.hpp
字号:
// Boost.Signals library// Copyright Douglas Gregor 2001-2004. Use, modification and// distribution is subject to 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)// For more information, see http://www.boost.org#ifndef BOOST_SIGNALS_COMMON_HEADER#define BOOST_SIGNALS_COMMON_HEADER#ifndef BOOST_SIGNALS_NAMESPACE# define BOOST_SIGNALS_NAMESPACE signals#endif#include <boost/type_traits/conversion_traits.hpp>#include <boost/ref.hpp>#include <boost/signals/detail/config.hpp>#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_PREFIX#endifnamespace boost { namespace BOOST_SIGNALS_NAMESPACE { namespace detail { // The unusable class is a placeholder for unused function arguments // It is also completely unusable except that it constructable from // anything. This helps compilers without partial specialization // handle slots returning void. struct unusable { unusable() {} }; // Determine the result type of a slot call template<typename R> struct slot_result_type { typedef R type; }; template<> struct slot_result_type<void> { typedef unusable type; }; // Determine if the given type T is a signal class signal_base; template<typename T> struct is_signal { BOOST_STATIC_CONSTANT(bool, value = (is_convertible<T*, signal_base*>::value)); }; /* * The IF implementation is temporary code. When a Boost metaprogramming * library is introduced, Boost.Signals will use it instead. */ namespace intimate { struct SelectThen { template<typename Then, typename Else> struct Result { typedef Then type; }; }; struct SelectElse { template<typename Then, typename Else> struct Result { typedef Else type; }; }; template<bool Condition> struct Selector { typedef SelectThen type; }; template<> struct Selector<false> { typedef SelectElse type; }; } // end namespace intimate template<bool Condition, typename Then, typename Else> struct IF { typedef typename intimate::Selector<Condition>::type select; typedef typename select::template Result<Then,Else>::type type; }; // Determine if the incoming argument is a reference_wrapper#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template<typename T> struct is_ref { BOOST_STATIC_CONSTANT(bool, value = false); }; template<typename T> struct is_ref<reference_wrapper<T> > { BOOST_STATIC_CONSTANT(bool, value = true); };#else // no partial specialization typedef char yes_type; typedef double no_type; no_type is_ref_tester(...); template<typename T> yes_type is_ref_tester(reference_wrapper<T>*); template<typename T> struct is_ref { static T* t; BOOST_STATIC_CONSTANT(bool, value = (sizeof(is_ref_tester(t)) == sizeof(yes_type))); };#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION // A slot can be a signal, a reference to a function object, or a // function object. struct signal_tag {}; struct reference_tag {}; struct value_tag {}; // Classify the given slot as a signal, a reference-to-slot, or a // standard slot template<typename S> class get_slot_tag { typedef typename IF<(is_signal<S>::value), signal_tag, value_tag>::type signal_or_value; public: typedef typename IF<(is_ref<S>::value), reference_tag, signal_or_value>::type type; }; // Forward declaration needed in lots of places class signal_base_impl; class bound_objects_visitor; class slot_base; } // end namespace detail } // end namespace BOOST_SIGNALS_NAMESPACE} // end namespace boost#ifdef BOOST_HAS_ABI_HEADERS# include BOOST_ABI_SUFFIX#endif#endif // BOOST_SIGNALS_COMMON_HEADER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -