??????????????????return_type??void????????з?????????????????????????????????????????????

template<typename first_type?? typename second_type>
class CEvent<void?? first_type?? second_type>
{
public:
    //other function
    //....
    void operator()(first_type p1?? second_type p2)
    {
        //...
        //invoker(p1?? p2);
        return;
    }
};

??????????????????????operator()?????????????return_type??????????????????????????????

???????????????????????????????????

??????????????????μ?????????

template<typename T>
struct IsVoid
{
    enum { value = false };
};
template<>
struct IsVoid<void>
{
    enum { value = true };
};
template<typename return_type?? typename first_type?? typename second_type>
class CEvent
{
public:
    other function
    ....
    return_type operator()(first_type p1?? second_type p2)
    {
        if(IsVoid<return_type>::value)
        {
            cout << "return type is void" << endl;
            //...
            //invoker(p1?? p2);
        }
        else
        {
            cout << "return type is not void" << endl;
            return_type ret = return_type();
            //...
            //ret = invoker(p1?? p2);
            return ret;
        }
    }
};

??????????????????????????if????????????????return_type??void??????????????????

???????????????????????????if???????????????????????????????

template<typename T>
struct IsVoid
{
    enum { value = false };
};
template<>
struct IsVoid<void>
{
    enum { value = true };
};
template<int v>
class Int2Type
{
    enum {value = v };
};
template<typename return_type?? typename first_type?? typename second_type>
class CEvent
{
public:
    //other function
    //....
    return_type InvokerImpl(first_type p1?? second_type p2?? Int2Type<true>)
    {
        cout << "return type is void" << endl;
        //...
        //invoker(p1?? p2);
    }
    return_type InvokerImpl(first_type p1?? second_type p2?? Int2Type<false>)
    {
        cout << "return type is not void" << endl;
        return_type ret = return_type();
        //...
        //ret = invoker(p1?? p2);
        return ret;
    }
    return_type operator()(first_type p1?? second_type p2)
    {
        return InvokerImpl(p1?? p2?? Int2Type<IsVoid<return_type>::value>());
    }
};

??????????????????????????????????????????????bool??????????????????ò?????????????????

??????????£?????????????????????????????????????????????????????????C++??????????????????????????????C++??????????????????(C++11)??????????C++???????ж?????????????Щ????????е?????е??????е??Ч????е??Ч?? ????????????????C++???????????????Ч??????????

?????????????C++ templates???????д???????????