4

可能重复:
函数模板的部分特化

我在任何地方都找不到我的问题的解决方案,因为如果我用我想出的关键字进行搜索,我会得到适合不同问题的解决方案。我知道这必须以前问过,只是找不到解决方案。

假设我有一个函数模板:

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 g++):

FILE: error: function template partial specialization 'print<vector<any> >' is not allowed

请注意,函数 print 只是一个示例。

我该如何解决这个问题?

4

3 回答 3

5

有一个通用的解决方法,其中函数模板只是将作业委托给类模板成员函数:

#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 Cato 所建议的那样),请这样做。

于 2012-11-08T14:54:15.833 回答
2

不要尝试专门化功能模板。改用重载

void print(int value)
{
    std::cout << value;
}

template<class any>
void print(vector<any> value) {}
于 2012-11-08T14:50:11.367 回答
1

不允许函数模板部分特化,因为它会导致违反单一定义规则。您通常可以只使用重载:

template<class any> print(vector<any> value) {}
于 2012-11-08T14:52:02.077 回答