C++11のdecltypeとenable_ifのif練習
#include <iostream>
#include <type_traits>
#include <vector>
extern void* enabler;
template<typename T>
constexpr auto has_begin(T* p) -> decltype((p->begin(), true))
{
return true;
}
template<typename T>
constexpr bool has_begin(...)
{
return false;
}
template <typename T, typename std::enable_if<has_begin<T>((T*)nullptr)>::type *& = enabler>
void foo(T a)
{
std::cout << "OK, it's container class" << std::endl;
}
template <typename T, typename std::enable_if<!has_begin<T>((T*)nullptr)>::type *& = enabler>
void foo(T a)
{
std::cout << "NG, it's not container class" << std::endl;
}
int main()
{
std::vector<int> v;
foo(v);
int a;
foo(a);
}