частичный шаблон шаблон вектор специализация - PullRequest
4 голосов
/ 09 марта 2020

У меня есть общая функция, которая обрабатывает разные контейнеры.

template<template<class, class> class C, class T, class A>
void handle(C<T, A> const& c)
{
    cout << "General handling\n";
}

Теперь я бы хотел, чтобы он реагировал по-разному, если я передал ему собственный контейнер. Для простоты я сначала попробовал это с обработкой вектора отдельным способом, пытаясь частично специализировать эту функцию для вектора.
Это то, что я думал, что это должно выглядеть. 1008 * g cc выдает следующую ошибку:

Не удалось выполнить программу Возвращенный компилятор: 1 Stderr компилятора: 16: 36: ошибка: идентификатор шаблона 'дескриптор класса std :: vector> 'в объявлении основного шаблона 16 | (std :: vector const & c) |

Можно ли это сделать с частичной специализацией шаблона?

Ответы [ 2 ]

8 голосов
/ 09 марта 2020

Шаблоны функций не могут быть частично специализированными ; который работает только с шаблонами классов и шаблонами переменных (начиная с C ++ 14). Вместо этого вы можете применить перегрузку шаблона функции .

например

template<template<class, class> class C, class T, class A>
void handle(C<T, A> const& c)
{
    cout << "General handling\n";
}

template<class T, class A>
void handle(std::vector<T, A> const& c)
{
    cout << "vector handling\n";
}
2 голосов
/ 09 марта 2020

Вы также можете использовать функторы. С их помощью вы можете частично специализировать то, что вы хотите

#include<iostream>
#include<vector>
#include <list>
template<template<class, class> class C, class T, class A>
struct handle {
    void operator()(C<T, A> const &c) {
        std::cout << "General handling\n";
    }
};

template<class T, class A>
struct handle<std::vector, T, A>{
    void operator()(std::vector<T, A> const& c)
    {
        std::cout << "vector handling\n";
    }
};
//To test
int main(){
    std::list<int, std::allocator<int>> ls(10,0);
    handle<std::list, int, std::allocator<int>>{} (ls);

    std::vector<int, std::allocator<int>> vec(10,0);
    handle<std::vector, int, std::allocator<int>>{} (vec);

}
...