我的类有两个模板参数:
template< typename T, size_t Len >
struct A {
size_t GetLen() const {
return Len;
}
T mArr[Len];
};
typedef A< int, 10 > IntArrOfTenLen;
typedef A< int, 5 > IntArrOfTenFive;
到目前为止一切顺利。现在我想写一个可以用这样的typedef变量做一些事情的函数。像这样:
void f(_arr)
{
std::cout << _arr[_arr.GetLen() - 1];
}
void g()
{
IntArrOfTenLen arr;
IntArrOfTenFive arr2;
f(arr);
f(arr2);
}
有可能吗?这个函数f()的签名应该是什么?
我试过以下:
template< typename A >
void f(A _arr) {
std::cout << _arr[_arr.GetLen() - 1];
}
这是失败的原因,因为没有提供 Len ,但提供Len会有点打败写GetLen()的目的,不是吗?
答案 0 :(得分:2)
如果您希望f
获取任意类型和长度的A
,请将其设为模板函数:
template <typename T, size_t Len>
void f(const A<T,Len>& arr) {
//...
}
您无需向此模板提供T
和Len
;它们将从论证中推断出来:
f(arr) //f<int, 10>
f(arr2) //f<int, 5>
当然,您可以在C ++ 11中使用std::array
而不是自己编写,而不是重新发明轮子。