Используйте диспетчеризацию тегов, чтобы проверить, реализует ли тип size_type - PullRequest
0 голосов
/ 24 марта 2020

Я ищу решение, чтобы узнать, реализует ли конкретный тип size_type. пока это есть ...

struct foo { 
using size_type = int; 
};

template<typename T> 
struct check_size_type {
    static constexpr bool value = true; // something else needs to go here
};  


template<typename T> 
constexpr bool has_size_type_t = check_size_type<T>::value;

int main(){
    static_assert(!has_size_type_t<int>);
    static_assert(has_size_type_t<std::vector<int>>);
    static_assert(has_size_type_t<foo>);  
}

1 Ответ

4 голосов
/ 24 марта 2020
template<class T, class=void> 
struct has_size_type : std::false_type { };

template<class T>
struct has_size_type<T, std::void_t<typename T::size_type>> : std::true_type { };

template<class T>
constexpr auto has_size_type_v = has_size_type<T>::value;

static_assert(!has_size_type_v<int>);
static_assert(has_size_type_v<std::vector<int>>);
static_assert(has_size_type_v<foo>);
...