📄 functor.h
字号:
};
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImplHelper
// Specialization for 10 parameters
////////////////////////////////////////////////////////////////////////////////
template <>
struct FunctorImplHelper<10>
{
template <typename R, class TList, template <class> class ThreadingModel>
class In : public Private::FunctorImplBase<R, ThreadingModel>
{
typedef typename TL::TypeAt<TList, 0>::Result P1;
typedef typename TL::TypeAt<TList, 1>::Result P2;
typedef typename TL::TypeAt<TList, 2>::Result P3;
typedef typename TL::TypeAt<TList, 3>::Result P4;
typedef typename TL::TypeAt<TList, 4>::Result P5;
typedef typename TL::TypeAt<TList, 5>::Result P6;
typedef typename TL::TypeAt<TList, 6>::Result P7;
typedef typename TL::TypeAt<TList, 7>::Result P8;
typedef typename TL::TypeAt<TList, 8>::Result P9;
typedef typename TL::TypeAt<TList, 9>::Result P10;
public:
typedef R ResultType;
typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef typename TypeTraits<P2>::ParameterType Parm2;
typedef typename TypeTraits<P3>::ParameterType Parm3;
typedef typename TypeTraits<P4>::ParameterType Parm4;
typedef typename TypeTraits<P5>::ParameterType Parm5;
typedef typename TypeTraits<P6>::ParameterType Parm6;
typedef typename TypeTraits<P7>::ParameterType Parm7;
typedef typename TypeTraits<P8>::ParameterType Parm8;
typedef typename TypeTraits<P9>::ParameterType Parm9;
typedef typename TypeTraits<P10>::ParameterType Parm10;
virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9, Parm10) = 0;
};
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImplHelper
// Specialization for 11 parameters
////////////////////////////////////////////////////////////////////////////////
template <>
struct FunctorImplHelper<11>
{
template <typename R, class TList, template <class> class ThreadingModel>
class In : public Private::FunctorImplBase<R, ThreadingModel>
{
typedef typename TL::TypeAt<TList, 0>::Result P1;
typedef typename TL::TypeAt<TList, 1>::Result P2;
typedef typename TL::TypeAt<TList, 2>::Result P3;
typedef typename TL::TypeAt<TList, 3>::Result P4;
typedef typename TL::TypeAt<TList, 4>::Result P5;
typedef typename TL::TypeAt<TList, 5>::Result P6;
typedef typename TL::TypeAt<TList, 6>::Result P7;
typedef typename TL::TypeAt<TList, 7>::Result P8;
typedef typename TL::TypeAt<TList, 8>::Result P9;
typedef typename TL::TypeAt<TList, 9>::Result P10;
typedef typename TL::TypeAt<TList, 10>::Result P11;
public:
typedef R ResultType;
typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef typename TypeTraits<P2>::ParameterType Parm2;
typedef typename TypeTraits<P3>::ParameterType Parm3;
typedef typename TypeTraits<P4>::ParameterType Parm4;
typedef typename TypeTraits<P5>::ParameterType Parm5;
typedef typename TypeTraits<P6>::ParameterType Parm6;
typedef typename TypeTraits<P7>::ParameterType Parm7;
typedef typename TypeTraits<P8>::ParameterType Parm8;
typedef typename TypeTraits<P9>::ParameterType Parm9;
typedef typename TypeTraits<P10>::ParameterType Parm10;
typedef typename TypeTraits<P11>::ParameterType Parm11;
virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9, Parm10, Parm11) = 0;
};
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImplHelper
// Specialization for 12 parameters
////////////////////////////////////////////////////////////////////////////////
template <>
struct FunctorImplHelper<12>
{
template <typename R, class TList, template <class> class ThreadingModel>
class In : public Private::FunctorImplBase<R, ThreadingModel>
{
typedef typename TL::TypeAt<TList, 0>::Result P1;
typedef typename TL::TypeAt<TList, 1>::Result P2;
typedef typename TL::TypeAt<TList, 2>::Result P3;
typedef typename TL::TypeAt<TList, 3>::Result P4;
typedef typename TL::TypeAt<TList, 4>::Result P5;
typedef typename TL::TypeAt<TList, 5>::Result P6;
typedef typename TL::TypeAt<TList, 6>::Result P7;
typedef typename TL::TypeAt<TList, 7>::Result P8;
typedef typename TL::TypeAt<TList, 8>::Result P9;
typedef typename TL::TypeAt<TList, 9>::Result P10;
typedef typename TL::TypeAt<TList, 10>::Result P11;
typedef typename TL::TypeAt<TList, 11>::Result P12;
public:
typedef R ResultType;
typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef typename TypeTraits<P2>::ParameterType Parm2;
typedef typename TypeTraits<P3>::ParameterType Parm3;
typedef typename TypeTraits<P4>::ParameterType Parm4;
typedef typename TypeTraits<P5>::ParameterType Parm5;
typedef typename TypeTraits<P6>::ParameterType Parm6;
typedef typename TypeTraits<P7>::ParameterType Parm7;
typedef typename TypeTraits<P8>::ParameterType Parm8;
typedef typename TypeTraits<P9>::ParameterType Parm9;
typedef typename TypeTraits<P10>::ParameterType Parm10;
typedef typename TypeTraits<P11>::ParameterType Parm11;
typedef typename TypeTraits<P12>::ParameterType Parm12;
virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9, Parm10, Parm11, Parm12) = 0;
};
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImplHelper
// Specialization for 13 parameters
////////////////////////////////////////////////////////////////////////////////
template <>
struct FunctorImplHelper<13>
{
template <typename R, class TList, template <class> class ThreadingModel>
class In : public Private::FunctorImplBase<R, ThreadingModel>
{
typedef typename TL::TypeAt<TList, 0>::Result P1;
typedef typename TL::TypeAt<TList, 1>::Result P2;
typedef typename TL::TypeAt<TList, 2>::Result P3;
typedef typename TL::TypeAt<TList, 3>::Result P4;
typedef typename TL::TypeAt<TList, 4>::Result P5;
typedef typename TL::TypeAt<TList, 5>::Result P6;
typedef typename TL::TypeAt<TList, 6>::Result P7;
typedef typename TL::TypeAt<TList, 7>::Result P8;
typedef typename TL::TypeAt<TList, 8>::Result P9;
typedef typename TL::TypeAt<TList, 9>::Result P10;
typedef typename TL::TypeAt<TList, 10>::Result P11;
typedef typename TL::TypeAt<TList, 11>::Result P12;
typedef typename TL::TypeAt<TList, 12>::Result P13;
public:
typedef R ResultType;
typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef typename TypeTraits<P2>::ParameterType Parm2;
typedef typename TypeTraits<P3>::ParameterType Parm3;
typedef typename TypeTraits<P4>::ParameterType Parm4;
typedef typename TypeTraits<P5>::ParameterType Parm5;
typedef typename TypeTraits<P6>::ParameterType Parm6;
typedef typename TypeTraits<P7>::ParameterType Parm7;
typedef typename TypeTraits<P8>::ParameterType Parm8;
typedef typename TypeTraits<P9>::ParameterType Parm9;
typedef typename TypeTraits<P10>::ParameterType Parm10;
typedef typename TypeTraits<P11>::ParameterType Parm11;
typedef typename TypeTraits<P12>::ParameterType Parm12;
typedef typename TypeTraits<P13>::ParameterType Parm13;
virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13) = 0;
};
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImplHelper
// Specialization for 14 parameters
////////////////////////////////////////////////////////////////////////////////
template <>
struct FunctorImplHelper<14>
{
template <typename R, class TList, template <class> class ThreadingModel>
class In : public Private::FunctorImplBase<R, ThreadingModel>
{
typedef typename TL::TypeAt<TList, 0>::Result P1;
typedef typename TL::TypeAt<TList, 1>::Result P2;
typedef typename TL::TypeAt<TList, 2>::Result P3;
typedef typename TL::TypeAt<TList, 3>::Result P4;
typedef typename TL::TypeAt<TList, 4>::Result P5;
typedef typename TL::TypeAt<TList, 5>::Result P6;
typedef typename TL::TypeAt<TList, 6>::Result P7;
typedef typename TL::TypeAt<TList, 7>::Result P8;
typedef typename TL::TypeAt<TList, 8>::Result P9;
typedef typename TL::TypeAt<TList, 9>::Result P10;
typedef typename TL::TypeAt<TList, 10>::Result P11;
typedef typename TL::TypeAt<TList, 11>::Result P12;
typedef typename TL::TypeAt<TList, 12>::Result P13;
typedef typename TL::TypeAt<TList, 13>::Result P14;
public:
typedef R ResultType;
typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef typename TypeTraits<P2>::ParameterType Parm2;
typedef typename TypeTraits<P3>::ParameterType Parm3;
typedef typename TypeTraits<P4>::ParameterType Parm4;
typedef typename TypeTraits<P5>::ParameterType Parm5;
typedef typename TypeTraits<P6>::ParameterType Parm6;
typedef typename TypeTraits<P7>::ParameterType Parm7;
typedef typename TypeTraits<P8>::ParameterType Parm8;
typedef typename TypeTraits<P9>::ParameterType Parm9;
typedef typename TypeTraits<P10>::ParameterType Parm10;
typedef typename TypeTraits<P11>::ParameterType Parm11;
typedef typename TypeTraits<P12>::ParameterType Parm12;
typedef typename TypeTraits<P13>::ParameterType Parm13;
typedef typename TypeTraits<P14>::ParameterType Parm14;
virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13, Parm14) = 0;
};
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImplHelper
// Specialization for 15 parameters
////////////////////////////////////////////////////////////////////////////////
template <>
struct FunctorImplHelper<15>
{
template <typename R, class TList, template <class> class ThreadingModel>
class In : public Private::FunctorImplBase<R, ThreadingModel>
{
typedef typename TL::TypeAt<TList, 0>::Result P1;
typedef typename TL::TypeAt<TList, 1>::Result P2;
typedef typename TL::TypeAt<TList, 2>::Result P3;
typedef typename TL::TypeAt<TList, 3>::Result P4;
typedef typename TL::TypeAt<TList, 4>::Result P5;
typedef typename TL::TypeAt<TList, 5>::Result P6;
typedef typename TL::TypeAt<TList, 6>::Result P7;
typedef typename TL::TypeAt<TList, 7>::Result P8;
typedef typename TL::TypeAt<TList, 8>::Result P9;
typedef typename TL::TypeAt<TList, 9>::Result P10;
typedef typename TL::TypeAt<TList, 10>::Result P11;
typedef typename TL::TypeAt<TList, 11>::Result P12;
typedef typename TL::TypeAt<TList, 12>::Result P13;
typedef typename TL::TypeAt<TList, 13>::Result P14;
typedef typename TL::TypeAt<TList, 14>::Result P15;
public:
typedef R ResultType;
typedef typename TypeTraits<P1>::ParameterType Parm1;
typedef typename TypeTraits<P2>::ParameterType Parm2;
typedef typename TypeTraits<P3>::ParameterType Parm3;
typedef typename TypeTraits<P4>::ParameterType Parm4;
typedef typename TypeTraits<P5>::ParameterType Parm5;
typedef typename TypeTraits<P6>::ParameterType Parm6;
typedef typename TypeTraits<P7>::ParameterType Parm7;
typedef typename TypeTraits<P8>::ParameterType Parm8;
typedef typename TypeTraits<P9>::ParameterType Parm9;
typedef typename TypeTraits<P10>::ParameterType Parm10;
typedef typename TypeTraits<P11>::ParameterType Parm11;
typedef typename TypeTraits<P12>::ParameterType Parm12;
typedef typename TypeTraits<P13>::ParameterType Parm13;
typedef typename TypeTraits<P14>::ParameterType Parm14;
typedef typename TypeTraits<P15>::ParameterType Parm15;
virtual R operator()(Parm1, Parm2, Parm3, Parm4, Parm5, Parm6, Parm7, Parm8, Parm9, Parm10, Parm11, Parm12, Parm13, Parm14, Parm15) = 0;
};
};
} // namespace Private
////////////////////////////////////////////////////////////////////////////////
// class template FunctorImpl
// The base class for a hierarchy of functors. The FunctorImpl class is not used
// directly; rather, the Functor class manages and forwards to a pointer to
// FunctorImpl
// You may want to derive your own functors from FunctorImpl.
// Specializations of FunctorImpl for up to 15 parameters follow
////////////////////////////////////////////////////////////////////////////////
template
<
typename R,
class TList,
template <class> class ThreadingModel = DEFAULT_THREADING
>
class FunctorImpl
: public Private::FunctorImplHelper
<
TL::Length<TList>::value
>
::template In<R, TList, ThreadingModel>
{
ASSERT_TYPELIST(TList);
};
////////////////////////////////////////////////////////////////////////////////
// class template FunctorHandler
// Wraps functors and pointers to functions
////////////////////////////////////////////////////////////////////////////////
template <class ParentFunctor, typename Fun>
class FunctorHandler
: public ParentFunctor::Impl
{
typedef typename ParentFunctor::Impl Base;
public:
typedef typename Base::ResultType ResultType;
typedef typename Base::Parm1 Parm1;
typedef typename Base::Parm2 Parm2;
typedef typename Base::Parm3 Parm3;
typedef typename Base::Parm4 Parm4;
typedef typename Base::Parm5 Parm5;
typedef typename Base::Parm6 Parm6;
typedef typename Base::Parm7 Parm7;
typedef typename Base::Parm8 Parm8;
typedef typename Base::Parm9 Parm9;
typedef typename Base::Parm10 Parm10;
typedef typename Base::Parm11 Parm11;
typedef typename Base::Parm12 Parm12;
typedef typename Base::Parm13 Parm13;
typedef typename Base::Parm14 Parm14;
typedef typename Base::Parm15 Parm15;
FunctorHandler(const Fun& fun) : f_(fun) {}
DEFINE_CLONE_FUNCTORIMPL(FunctorHandler)
// operator() implementations for up to 15 arguments
ResultType operator()()
{ return f_(); }
ResultType operator()(Parm1 p1)
{ return f_(p1); }
ResultType operator()(Parm1 p1, Parm2 p2)
{ return f_(p1, p2); }
ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3)
{ return f_(p1, p2, p3); }
ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4)
{ return f_(p1, p2, p3, p4); }
ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5)
{ return f_(p1, p2, p3, p4, p5); }
ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
Parm6 p6)
{ return f_(p1, p2, p3, p4, p5, p6); }
ResultType operator()(Parm1 p1, Parm2 p2, Parm3 p3, Parm4 p4, Parm5 p5,
Parm6 p6, Parm7 p7)
{ return f_(p1, p2, p3, p4, p5, p6, p7); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -