如何在 cocos2d-x 类中检查函数是否存在?

How to check for a function's existence in a cocos2d-x class?

本文关键字:函数 是否 存在 检查 cocos2d-x      更新时间:2023-10-16

我有很多来自CCNode子类的节点,其中一些具有函数ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)。现在我的问题是,是否可以用SFINAE检查他们是否拥有这个特定的功能。我试图在这个线程的帮助下使其工作:是否可以编写一个模板来检查函数';的存在?但我做不到。

这是我的:

template <typename T>
class hasMethodCCTouchBegan
{
    typedef char yes;
    typedef long no;
    template <typename C> static yes test( decltype(&C::ccTouchBegan) ) ;
    template <typename C> static no test(...);
public:
    enum { value = sizeof(test<T>(0)) == sizeof(yes) };
};

老实说,我不知道该怎么办。

我个人使用(在C++11中):

#include <cstdint>
#define DEFINE_HAS_SIGNATURE(traitsName, funcName, signature)               
    template <typename U>                                                   
    class traitsName                                                        
    {                                                                       
    private:                                                                
        template<typename T, T> struct helper;                              
        template<typename T>                                                
        static std::uint8_t check(helper<signature, &funcName>*);           
        template<typename T> static std::uint16_t check(...);               
    public:                                                                 
        static                                                              
        constexpr bool value = sizeof(check<U>(0)) == sizeof(std::uint8_t); 
    }
// Create your traits:
DEFINE_HAS_SIGNATURE(has_ccTouchBegan, T::ccTouchBegan, bool (T::*)(CCTouch *, CCEvent *));
template<class C>
decltype(&C::ccTouchBegan, std::true_type())
methodHelper(int);
template<class C>
std::false_type
methodHelper(...);
template<class C>
struct hasMethodCCTouchBegan : decltype(methodHelper<C>(0))
{
};

如果ccTouchBegan过载,这将不起作用。如果您想测试是否可以使用某些参数调用ccTouchBegan,则可以将&C::ccTouchBegan更改为std::declval<C>().ccTouchBegan(std::declval<CCTouch*>(), std::declval<CCEvent*>())