2016-07-01 3 views
0

Я хотел бы частично специализировать шаблон класса для std :: vector, содержащий основные типы.частная спецификация шаблона класса для std :: vector основных типов

Мой подход выглядит, но does not compile

#include <type_traits> 
#include <vector> 
#include <string> 
#include <iostream> 

template <typename T, bool bar = false> 
struct foo { 
    static void show() 
    { 
     std::cout << "T" << std::endl; 
    } 
}; 

template <typename T> 
struct foo<typename std::enable_if<std::is_fundamental<T>::value, std::vector<T>>::type, false> { 
    static void show() 
    { 
     std::cout << "std::vector<fundamental type>" << std::endl; 
    } 
}; 

template <typename T> 
struct foo<std::vector<T>, false> { 
    static void show() 
    { 
     std::cout << "std::vector<T>" << std::endl; 
    } 
}; 

int main() 
{ 
    foo<int>::show(); 
    foo<std::vector<int>>::show(); 
    foo<std::vector<std::string>>::show(); 
} 

Как я могу заставить его работать?

ответ

2
template <typename T, typename = void> 
struct foo 
{ 
    static void show() 
    { 
     std::cout << "T" << std::endl; 
    } 
}; 

template <typename T, typename Alloc> 
struct foo<std::vector<T, Alloc> 
     , typename std::enable_if<!std::is_fundamental<T>::value>::type> 
{ 
    static void show() 
    { 
     std::cout << "std::vector<T>" << std::endl; 
    } 
}; 

template <typename T, typename Alloc> 
struct foo<std::vector<T, Alloc> 
     , typename std::enable_if<std::is_fundamental<T>::value>::type> 
{ 
    static void show() 
    { 
     std::cout << "std::vector<fundamental type>" << std::endl; 
    } 
}; 

DEMO