2015-08-02 3 views
7

Увидев, что шаблон может быть частично специализированным для ссылочных или указательных типов, мне было интересно, могу ли я написать шаблон, который принимает только тип указателя для начала. Это моя попытка:Шаблон, который принимает только аргументы типа указателя

template <typename T*> 
struct MyTemplate{}; 

int main() { 
    MyTemplate<int *> c; 
    (void)c; 
    return 0; 
} 

Это не скомпилировано. Как его изменить? (То есть, если то, что я пытаюсь сделать это вообще возможно)

+0

Check [ 'станд :: is_pointer'] (http://en.cppreference.com/w/cpp/types). –

ответ

12

Вы можете использовать частичную специализацию:

template <typename T> struct MyTemplate; // Declaration 

template <typename T> struct MyTemplate<T*> // Specialization 
{ 
}; 

static_assert или использовать

template <typename T> struct MyTemplate 
{ 
    static_assert(std::is_pointer<T>::value, "Expected a pointer"); 

    // T = value_type* 
    using value_type = std::remove_pointer_t<T>; 
};