k3kaimu
7/5/2014 - 4:54 AM

C++11のdecltypeとenable_ifのif練習

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