2015-05-21 2 views
1

В этом вопросе:Проверьте, если класс имеет статическую функцию-член данной подписи

Check if a class has a member function of a given signature

Они решают проблему, как определить, если класс имеет функцию-член какого-либо типа. Это может звучать как наивный вопрос, но я не мог узнать сам по себе. Как определить, существует ли статическая функция данной сигнатуры? Не могли бы вы расширить пример, приведенный в вопросе, связанный, чтобы определить, есть ли статическая функция в этом классе, которая возвращает used_memory или что-то еще?

+1

Подсказка: изменение 'size_t (U :: *)() const' к' size_t (*)() ' –

+0

Это было легко на самом деле : D –

ответ

0

Вы можете использовать следующее:

#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); \ 
    } 

// signature is the important part for static. it is not (T::*) 
DEFINE_HAS_SIGNATURE(has_static_foo, T::foo, void (*)(void)); 

// signature use (T::*) here for member 
DEFINE_HAS_SIGNATURE(has_member_foo, T::foo, void (T::*)(void)); 

Live Example

Смежные вопросы