有没有办法为std :: array创建函数模板特化

时间:2012-01-17 12:12:30

标签: c++ arrays templates c++11 std

我有一个功能模板

template<typename T>
void output(T& value)
{
}

有没有办法为输出std :: array对象创建特化?是的,我知道,不同大小的数组是不同的类型。我只希望在c ++ 11中有一种方法

3 个答案:

答案 0 :(得分:2)

template<class T, unsigned N>
void output(std::array<T,N>& value){
}

使用的是什么,因为不鼓励专业化。此外,您无法部分专门化功能模板。

答案 1 :(得分:2)

您不能为所有数组专门化它,这需要模板的“部分特化”。模板的完全特化会固定所有模板参数的值(在这种情况下只有一个T,因此完全特化仅覆盖一种类型而不是T)。部分特化包含模板参数的多个可能值(在这种情况下,我们希望覆盖std::array<U,N>代替任何T),因此部分特化具有自己的模板参数。

C ++允许对类模板进行部分特化,但不允许使用函数模板。

相反,你可以重载它。您可以使用相同的名称和不同的参数定义另一个函数模板:

template <typename T, size_t N>
void output (const std::array<T,N> &arr); // I guess "const" by the function name

答案 2 :(得分:1)

你需要一个overload,而不是一个专业化(只有完全专业化的功能模板)。

template <typename T, size_t N>
void output (std::array<T,N> &arr);

不允许您将其放入namespace std。如果它只输出数据,则不应传递非const引用。

但是,转到标准库的路径,改为使用迭代器:

template <typename Iter>
void output (Iter it, Iter end) 

这使您的功能变得灵活w.r.t.容器类型:它可能不需要知道它是listdeque还是array