如何在 cocos2d-x 类中检查函数是否存在?
How to check for a function's existence in a cocos2d-x class?
我有很多来自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*>())
。
相关文章:
- 函数是否可以访问传递给main()的参数
- 根据某个函数是否存在启用模板
- 无论如何,我可以确定构造函数是否存在吗?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 如何检查函数是否在LLVM Instrumentation pass的ModulePass的系统头文件中定义?
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 某些 boost::asio 异步函数是否将处理程序连接到操作,以便处理程序被触发一次?
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 由并发无序映射查找线程调用的函数是否安全?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 从其存储的回调中删除 std::函数是否安全
- 析构函数是否会自动调用 delete[] C++?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 移动构造函数是否C++过时?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 此函数是否会在C++中创建内存泄漏?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- 如何检测构造函数是否与抛出的析构函数无关