#include <iomanip>
#include <iostream>
#include <map>
#include <type_traits>
#include <vector>
#define DEFINE_HAS_MEMBER(Member) \
template <typename, typename = std::void_t<>> \
struct HasMemberT_##Member \
: std::false_type \
{ \
}; \
template <typename T> \
struct HasMemberT_##Member<T, std::void_t<decltype(&T::Member)>> : std::true_type \
{ \
};
DEFINE_HAS_MEMBER(size);
void Test()
{
std::cout << HasMemberT_size<int>::value << std::endl;
std::cout << HasMemberT_size<std::vector<int>>::value << std::endl;
}
template <typename, typename = std::void_t<>>
struct IsBeginT : std::false_type
{
};
template <typename T>
struct IsBeginT<T, std::void_t<decltype(std::declval<T>().begin())>> : std::true_type
{
};
void Test1()
{
std::cout << IsBeginT<char>::value << std::endl;
std::cout << IsBeginT<std::vector<int>>::value << std::endl;
}
int main()
{
Test1();
}