我有一个功能模板
template<typename T>
void output(T& value)
{
}
有没有办法为输出std :: array对象创建特化?是的,我知道,不同大小的数组是不同的类型。我只希望在c ++ 11中有一种方法
答案 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.容器类型:它可能不需要知道它是list
,deque
还是array
。