可能重复:
函数模板的偏特
我不能在任何地方找到我的问题的解决方案,因为如果我跟我拿出会给我适合不同问题的解决方案的关键字搜索。 据我所知,这必须被要求之前,就不能找到一个解决方案。
假设我有一个函数模板:
template<class any> print(any value);
我可以专注像这样对我们说一个int
:
template<> print<int>(int value)
{
std::cout << value;
}
但现在的问题,我希望它有一个载体正常工作。 由于矢量类是一个模板类,它变得困难。
专业像这样的功能:
template<class any> print<vector<any> >(vector<any> value) {}
将生成以下错误(MinGW的克++):
FILE: error: function template partial specialization 'print<vector<any> >' is not allowed
请注意该函数打印仅仅是一个例子。
我该如何解决这个问题?
有一个在该函数模板只是代表该作业类模板成员函数的一般解决方法:
#include <vector>
#include <iostream>
template <typename T> struct helper {
static void print(T value) { std::cout << value; }
};
template <typename T> struct helper<std::vector<T>> {
static void print(std::vector<T> const &value) { }
};
template <typename T>
void print (T const &value) {
// Just delegate.
helper<T>::print (value);
}
int main () {
print (5);
std::vector<int> v;
print (v);
}
但是,如果你可以用简单的函数重载(如ecatmur和Vaughn卡托建议)来用,这样做。
不要试图专注函数模板。 使用代替超载
void print(int value)
{
std::cout << value;
}
和
template<class any>
void print(vector<any> value) {}
函数模板部分特例是不允许的,因为这会导致一个定义规则的违规行为。 你通常可以只使用过载:
template<class any> print(vector<any> value) {}