部分模板模板向量特化

partial template template vector specialization

我有一个处理不同容器的通用函数。

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>(std::vector<T, A> const& c)
{
    cout << "vector handling\n";
}

但是gcc给出了以下错误:

Could not execute the program Compiler returned: 1 Compiler stderr :16:36: error: template-id 'handle class std::vector>' in declaration of primary template 16 | (std::vector const& c) |

这可以通过部分模板特化来完成吗?

函数模板不能partial specialized; which only works with class templates and variable templates (since C++14). You can apply function template overloading代替。

例如

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

你也可以使用仿函数。有了它们,您可以部分专注于您想要的东西

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

}