zoukankan      html  css  js  c++  java
  • check member function

    template<typename T>
    struct has_member_foo11
    {
    private:
        template<typename U> static auto check(int) -> decltype(std::declval<U>().foo(), std::true_type());
    
        template<typename U> static std::false_type check(...);
    public:
        enum { value = std::is_same<decltype(check<T>(0)), std::true_type>::value };
    };
    
    //more universal
    
    template<typename T, typename... Args>
    struct has_member_foo11
    {
    private:
        template<typename U> static auto check(int) -> decltype(std::declval<U>().foo(std::declval<Args>()...), std::true_type());
    
        template<typename U> static std::false_type check(...);
    public:
        enum { value = std::is_same<decltype(check<T>(0)), std::true_type>::value };
    };
    
    //Improve
    #define HAS_MEMBER(member)
    template<typename T, typename... Args>struct has_member_##member
    {
        private:
            template<typename U> static auto Check(int) -> decltype(std::declval<U>().member(std::declval<Args>()...), std::true_type());
            template<typename U> static std::false_type Check(...);
        public:
            enum{value = std::is_same<decltype(Check<T>(0)), std::true_type>::value};
    };
    
    //test code
    HAS_MEMBER(foo)
    HAS_MEMBER(func)
    
    struct MyStruct
    {
        string foo() { return ""; }
        int func(int i) { return i; }
    };
    
    static_assert(has_member_foo<MyStruct>::value, "true");
    static_assert(has_member_func<MyStruct, int>::value, "true");
  • 相关阅读:
    Linux:闪光的宝石,智慧 (在)
    采用jqueryUI创建日期选择器
    C++学习笔记9-运算符重载
    spring mvc综合easyui点击上面菜单栏中的菜单项问题
    TCP拥塞控制 (1)
    牛顿迭代法
    【6】和作为连续序列s
    动态规划-简介
    约瑟夫环问题
    j简单的递归
  • 原文地址:https://www.cnblogs.com/qicosmos/p/4929973.html
Copyright © 2011-2022 走看看