我正在编写一个模板类,它包装成员函数以减少一些调用 - 如果某些条件为真,则不需要调用成员函数。签名看起来像这样
template <typename MemFuncType, MemFuncType> class MemberWrapper;
我可以这样专门化它:
template <typename R, typename T, R T::* MemFunc> class MemberWrapper<R T::*, MemFunc>{};
我还想限制参数的数量R T::*
。我该怎么做呢?
我能想到的唯一解决方案是通过提供基于返回类型、函数类型、参数列表和 cv 限定符的部分特化来实现成员函数特征类。这将导致像当前的那样繁琐的实施std::mem_fn
超载 http://en.cppreference.com/w/cpp/utility/functional/mem_fn。有没有办法做得更好?
编辑:已更改Ret
to R
。正如评论中所指出的,它实际上不是返回类型,并且专业化无效。
不要尝试将所有内容都放入一个类中。成员函数是属于类的成员的函数。因此,首先创建一些函数特征类,例如
template< typename T >
class function_traits
{
static_assert( sizeof( T ) == 0,
"function_traits<T>: T is not a function type" );
};
template< typename R, typename... Ts >
struct function_traits< R( Ts... ) >
{
constexpr static const std::size_t arity = sizeof...( Ts );
using result_type = R;
};
template< typename R, typename... Ts >
struct function_traits< R( Ts... ) const > : function_traits< R( Ts... ) > {};
template< typename R, typename... Ts >
struct function_traits< R( Ts... ) & > : function_traits< R( Ts... ) > {};
template< typename R, typename... Ts >
struct function_traits< R( Ts... ) const & > : function_traits< R( Ts... ) > {};
template< typename R, typename... Ts >
struct function_traits< R( Ts... ) && > : function_traits< R( Ts... ) > {};
template< typename R, typename... Ts >
struct function_traits< R( Ts... ) const && > : function_traits< R( Ts... ) > {};
这样,您可以轻松限制类中参数的数量:
template <typename Ret, typename T>
class MemberWrapper<Ret T::*>
{
static_assert( function_traits<Ret>::arity <= 4,
"More than 4 arguments are not allowed" );
};
实例 http://coliru.stacked-crooked.com/a/c1313cb6abf4ae99
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)