c_cpp 检查/断言类是否具有给定签名的方法。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 检查/断言类是否具有给定签名的方法。相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <string>

class A {
public:
    void method1();
    void method2(int);
    static void method3(int []);
};

#define HAS_METHOD(Class, MethodName, ReturnType, ...) (std::is_same<ReturnType (Class::*)(__VA_ARGS__), decltype(&Class::MethodName)>::value)
#define HAS_STATIC_METHOD(Class, MethodName, ReturnType, ...) (std::is_same<ReturnType (*)(__VA_ARGS__), decltype(&Class::MethodName)>::value)

#define ASSERT_METHOD(Class, MethodName, ReturnType, ...) \
    static_assert(HAS_METHOD(Class, MethodName, ReturnType, __VA_ARGS__), "Class does not have required method or method has wrong signature")
#define ASSERT_STATIC_METHOD(Class, MethodName, ReturnType, ...) \
    static_assert(HAS_STATIC_METHOD(Class, MethodName, ReturnType, __VA_ARGS__), "Class does not have required method or method has wrong signature")
    
int main()
{
    ASSERT_METHOD(A, method1, void,);
    ASSERT_METHOD(A, method2, void, int);
    ASSERT_STATIC_METHOD(A, method3, void, int[]);
    
    std::cout << "method1: " << (HAS_METHOD       (A, method1, void,      ) ? "yes" : "no")  << std::endl;
    std::cout << "method2: " << (HAS_METHOD       (A, method2, void, int  ) ? "yes" : "no")  << std::endl;
    std::cout << "method3: " << (HAS_STATIC_METHOD(A, method3, void, int[]) ? "yes" : "no")  << std::endl;
    
    std::cout << std::endl << "Press RETURN to terminate" << std::endl;
    char dummy; std::cin >> std::noskipws >> dummy;

    return 0;
}

以上是关于c_cpp 检查/断言类是否具有给定签名的方法。的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp GFG如何检查两个给定的线段是否相交

c_cpp 程序检查给定的数字是否是阿姆斯特朗

c_cpp 检查给定数组是否可以表示BST的Preorder Traversal

c_cpp 检查是否存在具有奇数加权总和的循环

c_cpp 编写一个函数来检查给定字符串是否与给定模式匹配为非连续子字符串:即,模式中的所有字符

c_cpp 检查类指针是否为空