自己写的C++类型枚举量,可以使用类型识别取代模板,绑定枚举量和多组调用函数,在调用阶段只要指定某组函数就可以根据枚举量调用相应函数。

代码如下:

#ifndef __MYENUM_H__
#define __MYENUM_H__ namespace MyEnum {
#include <assert.h> //------------------------------------------------------ EnumFunction ------------------------------------------// /** 绑定序号和函数对象 */
template<int _ID, typename _FUNC>
class EnumFunction
{
public:
enum { id = _ID, };
typedef _FUNC func;
}; // end class EnumFunction template<int _ID>
class _Nil { public: enum { id = _ID, };}; /** 空函数用作占位 */
class _NilFunc
{
public:
/** 无参数版本 */
void operator()(){};
/** 带一个参数版本 */
template<typename _Pr0> void operator() (_Pr0){};
/** 带一个参数版本 */
template<typename _Pr0, typename _Pr1> void operator() (_Pr0, _Pr1){};
/** 带两个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2> void operator() (_Pr0, _Pr1, _Pr2){};
/** 带三个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3> void operator() (_Pr0, _Pr1, _Pr2, _Pr3){};
/** 带四个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4>
void operator() (_Pr0, _Pr1, _Pr2, _Pr3, _Pr4){};
/** 带五个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5>
void operator() (_Pr0, _Pr1, _Pr2, _Pr3, _Pr4, _Pr5){};
/** 带六个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6>
void operator() (_Pr0, _Pr1, _Pr2, _Pr3, _Pr4, _Pr5, _Pr6){};
/** 带七个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6,
typename _Pr7>
void operator() (_Pr0, _Pr1, _Pr2, _Pr3, _Pr4, _Pr5, _Pr6, _Pr7){};
/** 带八个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6,
typename _Pr7, typename _Pr8>
void operator() (_Pr0, _Pr1, _Pr2, _Pr3, _Pr4, _Pr5, _Pr6, _Pr7, _Pr8){};
/** 带九个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6,
typename _Pr7, typename _Pr8, typename _Pr9>
void operator() (_Pr0, _Pr1, _Pr2, _Pr3, _Pr4, _Pr5, _Pr6, _Pr7, _Pr8, _Pr9){};
}; /** 用于适配EnumFunction */
template<typename _EnumFunc>
class _NormalFunc
{
public:
/** 无参数版本 */
void operator()(){ _EnumFunc::func()(); };
/** 带一个参数版本 */
template<typename _Pr0> void operator()(_Pr0 pr0){ _EnumFunc::func()(pr0); };
/** 带一个参数版本 */
template<typename _Pr0, typename _Pr1> void operator()(_Pr0 pr0, _Pr1 pr1){ _EnumFunc::func()(pr0, pr1); };
/** 带两个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2> void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2){ _EnumFunc::func()(pr0, pr1, pr2); };
/** 带三个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3){ _EnumFunc::func()(pr0, pr1, pr2, pr3); };
/** 带四个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4){ _EnumFunc::func()(pr0, pr1, pr2, pr3, pr4); };
/** 带五个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5){ _EnumFunc::func()(pr0, pr1, pr2, pr3, pr4, pr5); };
/** 带六个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6){ _EnumFunc::func()(pr0, pr1, pr2, pr3, pr4, pr5, pr6); };
/** 带七个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6,
typename _Pr7>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6, _Pr7 pr7){
_EnumFunc::func()(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7); };
/** 带八个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6,
typename _Pr7, typename _Pr8>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6, _Pr7 pr7, _Pr8 pr8){
_EnumFunc::func()(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7, pr8); };
/** 带九个参数版本 */
template<typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4, typename _Pr5, typename _Pr6,
typename _Pr7, typename _Pr8, typename _Pr9>
void operator()(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6, _Pr7 pr7, _Pr8 pr8, _Pr9 pr9){
_EnumFunc::func()(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7, pr8, pr9); };
}; //-------------------------------------------------------- EnumItem ---------------------------------------------// #define _DEFAULT_NIL_FUNC(num) typename _Ty##num = _Nil<INT_MIN + num>
/** 枚举值,最多十个绑定函数 */
template<_DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC(),
_DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC(),
_DEFAULT_NIL_FUNC(), _DEFAULT_NIL_FUNC()>
class EnumItem
{
public:
template<int _ID> class Invoke {};
template<>
class Invoke<_Ty0::id> : public _NormalFunc<_Ty0> {};
template<>
class Invoke<_Ty1::id> : public _NormalFunc<_Ty1> {};
template<>
class Invoke<_Ty2::id> : public _NormalFunc<_Ty2> {};
template<>
class Invoke<_Ty3::id> : public _NormalFunc<_Ty3> {};
template<>
class Invoke<_Ty4::id> : public _NormalFunc<_Ty4> {};
template<>
class Invoke<_Ty5::id> : public _NormalFunc<_Ty5> {};
template<>
class Invoke<_Ty6::id> : public _NormalFunc<_Ty6> {};
template<>
class Invoke<_Ty7::id> : public _NormalFunc<_Ty7> {};
template<>
class Invoke<_Ty8::id> : public _NormalFunc<_Ty8> {};
template<>
class Invoke<_Ty9::id> : public _NormalFunc<_Ty9> {}; static int enumID;
}; int _Count() { static int _count = ; return ++ _count; } template<typename _Ty0, typename _Ty1, typename _Ty2, typename _Ty3,
typename _Ty4, typename _Ty5, typename _Ty6, typename _Ty7,
typename _Ty8, typename _Ty9>
int EnumItem<_Ty0, _Ty1, _Ty2, _Ty3, _Ty4, _Ty5, _Ty6, _Ty7, _Ty8, _Ty9>::enumID = _Count(); //--------------------------------------------------- Enum ---------------------------------------------//
template<int _ID> class _NilEnumItem
{
public:
template<int id>
class Invoke : public _NilFunc {}; static const int enumID = _ID;
};
#define DEFAULT_NIL_ITEM(num) typename _Ty##num = _NilEnumItem<INT_MIN + num> template<DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM(),
DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM(),
DEFAULT_NIL_ITEM(), DEFAULT_NIL_ITEM()>
class Enum
{
private:
explicit Enum(_Ty0) : enumID(_Ty0::enumID) {}
explicit Enum(_Ty1) : enumID(_Ty1::enumID) {}
explicit Enum(_Ty2) : enumID(_Ty2::enumID) {}
explicit Enum(_Ty3) : enumID(_Ty3::enumID) {}
explicit Enum(_Ty4) : enumID(_Ty4::enumID) {}
explicit Enum(_Ty5) : enumID(_Ty5::enumID) {}
explicit Enum(_Ty6) : enumID(_Ty6::enumID) {}
explicit Enum(_Ty7) : enumID(_Ty7::enumID) {}
explicit Enum(_Ty8) : enumID(_Ty8::enumID) {}
explicit Enum(_Ty9) : enumID(_Ty9::enumID) {} public:
template<typename _T>
static Enum Get() { return Enum(_T()); } template<typename _T>
bool EqualTo() { enumID == Enum(_T()); } bool operator == (const Enum& e) { return enumID == e.enumID; }
bool operator != (const Enum& e) { return enumID != e.enumID; } #define _PARAMLIST0
#define _PARAMLIST1(p1) p1
#define _PARAMLIST2(p1, p2) p1,##p2
#define _PARAMLIST3(p1, p2, p3) p1,##p2,##p3
#define _PARAMLIST4(p1, p2, p3, p4) p1,##p2,##p3,##p4
#define _PARAMLIST5(p1, p2, p3, p4, p5) p1,##p2,##p3,##p4,##p5
#define _PARAMLIST6(p1, p2, p3, p4, p5, p6) p1,##p2,##p3,##p4,##p5,##p6
#define _PARAMLIST7(p1, p2, p3, p4, p5, p6, p7) p1,##p2,##p3,##p4,##p5,##p6,##p7
#define _PARAMLIST8(p1, p2, p3, p4, p5, p6, p7, p8) p1,##p2,##p3,##p4,##p5,##p6,##p7,##p8
#define _PARAMLIST9(p1, p2, p3, p4, p5, p6, p7, p8, p9) p1,##p2,##p3,##p4,##p5,##p6,##p7,##p8,##p9
#define _PARAMLIST10(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) p1,##p2,##p3,##p4,##p5,##p6,##p7,##p8,##p9,##p10 #define _INVOKE_WITHOUT_RETURN_BODY(_PARAMSLIST) \
if(enumID == _Ty0::enumID) \
_Ty0::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty1::enumID) \
_Ty1::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty2::enumID) \
_Ty3::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty3::enumID) \
_Ty4::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty4::enumID) \
_Ty4::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty5::enumID) \
_Ty5::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty6::enumID) \
_Ty6::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty7::enumID) \
_Ty7::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty8::enumID) \
_Ty8::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty9::enumID) \
_Ty9::Invoke<_FuncID>()(_PARAMSLIST); \
else \
assert(false && "提供不存在enumID"); template<int _FuncID>
void InvokeWithoutReturn()
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST0); } template<int _FuncID, typename _Pr0>
void InvokeWithoutReturn(_Pr0 pr0)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST1(pr0)); } template<int _FuncID, typename _Pr0, typename _Pr1>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST2(pr0, pr1)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST3(pr0, pr1, pr2)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST4(pr0, pr1, pr2, pr3)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST5(pr0, pr1, pr2, pr3, pr4)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4
, typename _Pr5>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST6(pr0, pr1, pr2, pr3, pr4, pr5)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4
, typename _Pr5, typename _Pr6>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5,
_Pr6 pr6)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST7(pr0, pr1, pr2, pr3, pr4, pr5, pr6)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4
, typename _Pr5, typename _Pr6, typename _Pr7>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5,
_Pr6 pr6, _Pr7 pr7)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST8(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4
, typename _Pr5, typename _Pr6, typename _Pr7, typename _Pr8>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5,
_Pr6 pr6, _Pr7 pr7, _Pr8 pr8)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST9(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7, pr8)); } template<int _FuncID, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3, typename _Pr4
, typename _Pr5, typename _Pr6, typename _Pr7, typename _Pr8, typename _Pr9>
void InvokeWithoutReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5,
_Pr6 pr6, _Pr7 pr7, _Pr8 pr8, _Pr9 pr9)
{ _INVOKE_WITHOUT_RETURN_BODY(_PARAMLIST10(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7, pr8, pr9)); } #define _INVOKE_WITH_RETURN_BODY(_PARAMSLIST) \
if(enumID == _Ty0::enumID) \
return _Ty0::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty1::enumID) \
return _Ty1::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty2::enumID) \
return _Ty3::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty3::enumID) \
return _Ty4::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty4::enumID) \
return _Ty4::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty5::enumID) \
return _Ty5::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty6::enumID) \
return _Ty6::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty7::enumID) \
return _Ty7::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty8::enumID) \
return _Ty8::Invoke<_FuncID>()(_PARAMSLIST); \
else if(enumID == _Ty9::enumID) \
return _Ty9::Invoke<_FuncID>()(_PARAMSLIST); \
else \
assert(false && "提供不存在enumID"); template<int _FuncID, typename _Ret>
_Ret InvokeWithReturn()
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST0); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1>
_Ret InvokeWithReturn(_Pr0 pr0)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST1(pr0)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST2(pr0, pr1)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST3(pr0, pr1, pr2)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST4(pr0, pr1, pr2, pr3)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3,
typename _Pr4>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST5(pr0, pr1, pr2, pr3, pr4)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3,
typename _Pr4, typename _Pr5>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST6(pr0, pr1, pr2, pr3, pr4, pr5)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3,
typename _Pr4, typename _Pr5, typename _Pr6>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST7(pr0, pr1, pr2, pr3, pr4, pr5, pr6)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3,
typename _Pr4, typename _Pr5, typename _Pr6, typename _Pr7>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6,
_Pr7 pr7)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST8(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3,
typename _Pr4, typename _Pr5, typename _Pr6, typename _Pr7, typename _Pr8>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6,
_Pr7 pr7, _Pr8 pr8)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST9(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7, pr8)); } template<int _FuncID, typename _Ret, typename _Pr0, typename _Pr1, typename _Pr2, typename _Pr3,
typename _Pr4, typename _Pr5, typename _Pr6, typename _Pr7, typename _Pr8, typename _Pr9>
_Ret InvokeWithReturn(_Pr0 pr0, _Pr1 pr1, _Pr2 pr2, _Pr3 pr3, _Pr4 pr4, _Pr5 pr5, _Pr6 pr6,
_Pr7 pr7, _Pr8 pr8, _Pr9 pr9)
{ _INVOKE_WITH_RETURN_BODY(_PARAMLIST10(pr0, pr1, pr2, pr3, pr4, pr5, pr6, pr7, pr8, pr9)); } private:
int enumID;
}; } #endif // end __MYENUM_H___

测试用代码:

#include <iostream>
#include "MyEnum.h"
using namespace MyEnum; template<typename _Ty0, typename _Ty1>
class F0
{
public:
void operator() (_Ty0 t0, _Ty0 t1)
{
std::cout << "Enum1 - Func:F0 () -> { x + y } = " << t0 + t1 << std::endl;
}
}; template<typename _Ty0, typename _Ty1>
class F1
{
public:
void operator() (_Ty0 t0, _Ty0 t1)
{
std::cout << "Enum1 - Func:F1 () -> { x * y } = " << t1 * t0 << std::endl;
}
}; template<typename _Ty0, typename _Ty1>
class F2
{
public:
void operator() (_Ty0 t0, _Ty0 t1)
{
std::cout << "Enum2 - Func:F2 () -> { x - y } = " << t0 - t1 << std::endl;
}
}; template<typename _Ty0, typename _Ty1>
class F3
{
public:
void operator() (_Ty0 t0, _Ty0 t1)
{
std::cout << "Enum2 - Func:F3 () -> { x / y } = " << t1 / t0 << std::endl;
}
}; class Enum1 : public EnumItem< EnumFunction<, F0<int, int>>, EnumFunction<, F1<int, int>> > {};
class Enum2 : public EnumItem< EnumFunction<, F2<int, int>>, EnumFunction<, F3<int, int>> > {};
typedef Enum<
Enum1,
Enum2
> EnumTest; void Invoke0(EnumTest e, int p1, int p2)
{
e.InvokeWithoutReturn<>(p1, p2);
} void Invoke2(EnumTest e, int p1, int p2)
{
e.InvokeWithoutReturn<>(p1, p2);
} int main()
{
EnumTest enum1 = EnumTest::Get<Enum1>();
EnumTest enum2 = EnumTest::Get<Enum2>(); Invoke0(enum1, , );
Invoke0(enum2, , ); std::cout << std::endl; Invoke2(enum1, , );
Invoke2(enum2, , ); std::cout << std::endl; //enum2.InvokeWithoutReturn<0>(); enum2 = enum1;
Invoke0(enum2, , ); if(enum2 == enum1) {
std::cout << "Enum2 == Enum1" << std::endl;
}
else {
std::cout << "Enum2 != Enum1" << std::endl;
} return ;
}

测试结果 :

可以看见我们完美地把一组函数绑定到enum1与enum2上,并通过 InvokeWithoutReturn<n>()方法可以指定调用哪一组函数

C++使用类型代替枚举量的更多相关文章

  1. 【C/C++开发】C++之enum枚举量声明、定义、使用与枚举类详解与枚举类前置类型声明

    众所周知,C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行,下面我们一起看下enum的使用方法. ...

  2. { MySQL基础数据类型}一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型

    MySQL基础数据类型 阅读目录 一 介绍 二 数值类型 三 日期类型 四 字符串类型 五 枚举类型与集合类型 一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己 ...

  3. C++之enum枚举量声明、定义、使用与枚举类详解

    C++之enum枚举量声明.定义.使用与枚举类详解 学习一个东西,首先应该指导它能做什么,其次去知道它怎么去做,最后知道为什么去这么做. 知其然知其所以然.不能冒进 ,一步一步的慢慢来.

  4. Entity FreamWork 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型错误解决

    Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指 ...

  5. 无法创建“System.Object”类型的常量值。此上下文仅支持基元类型或枚举类型

    Entity FreamWork 无法创建“System.Object”类型的常量值.此上下文仅支持基元类型或枚举类型错误解决: 最近在开发中把我原来抄的架构里面的主键由固定的Guid改成了可以泛型指 ...

  6. 无法创建“Sunlight.Silverlight.Dcs.Web.PartsSupplier”类型的常量值。此上下文仅支持基元类型或枚举类型问题

    今天写代码遇到一个问题,            const string SCODE = "123";            var suppliers = PartsSuppli ...

  7. 04_Swift2基础之类型安全和类型推测+字面量+类型别名

    1. 类型安全和类型推测 1> 类型安全 Swift 是一个 _类型安全(type safe)_ 的语言.类型安全的语言可以让你清楚地知道代码要处理的值的类型.如果你的代码需要一个`String ...

  8. 深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题(转)

    写在前面: Java SE5 提供了一种新的类型 Java的枚举类型,关键字 enum 可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能 ...

  9. Java初学者笔记一:元类、获取类型、枚举

    零.绪论: 2018年新年伊始,学习Java的冲动越来越强烈,毕竟以后无论是做安全开发还是安全研究都必不可少的掌握这门语言,所以在不断完善Python作为脚本语言的主语言的情况下觉得学习Java作为高 ...

随机推荐

  1. google对js延迟加载方案的建议

    浏览器在执行JavaScript代码时会停止处理页面,当页面中有很多JavaScript文件或代码要加载时,将导致严重的延迟.尽管可以使用defer.异步或将JavaScript代码放到页面底部来延迟 ...

  2. oc-18-继承

    //Animal.h #import <Foundation/Foundation.h> @interface Animal : NSObject { int _age; // 不写@pu ...

  3. ajax重写,js方法重新

    重写Jquery的$.ajax方法 (function($){ //备份jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=functio ...

  4. Linux下校验下载文件的完整性(MD5,SHA1,PGP)

    查看: Linux下校验下载文件的完整性(MD5,SHA1,PGP) http://blog.useasp.net/archive/2014/03/29/use-md5-sha1-or-pgp-to- ...

  5. C++类设计2(Class with pointer members)

    二 Class with pointer members(Class String) 1. 测试代码(使用效果) int main() { String s1(), String s2("h ...

  6. tachyon with spark

    spark1.2.0  tachyon0.5.0 jdk1.7 scala2.10.4 1.装好spark.tachyon.jdk.scala 2.修改spark-env.sh添加Tachyon客户端 ...

  7. 如何设计App登录模块?

    1.熟悉目前常见的手机APP登陆方式 ① 账号登陆(手机.邮箱) ② 第三方登陆(微信,QQ,微博) ③ 一键快捷登录(工具类,如不记单词) ④ 游客登陆(bbs) ⑤ demo测试登陆(如友盟等) ...

  8. .NET和SQL Server中“空值”辨析 (DBNull与Null的区别)

    对表进行插入操作,如datetime和int类型的两个字段,都允许为null,用“sqlcmd.Parameters.Add("@t12",tb12.Text)”参数绑定时.dat ...

  9. 【阿里云产品公测】在Laravel4框架中使用阿里云OCS缓存

    作者:阿里云用户 supechina Laravel 是我最近用得非常多而且越用就越喜欢的一款PHP框架,由于没有向下兼容的历史包袱,完全面向对象的风格,借助 Facades 优雅的 IoC Cont ...

  10. putty ssh login linux

    (1) in linux $ ssh-keygen -t dsa $ cd .ssh $ cat id_dsa.pub > authorized_keys $ chmod 600 authori ...