模板化函数在模板化的typedef上

时间:2016-03-29 14:25:09

标签: c++ templates typedef

我的类有两个模板参数:

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()的目的,不是吗?

1 个答案:

答案 0 :(得分:2)

如果您希望f获取任意类型和长度的A,请将其设为模板函数:

template <typename T, size_t Len>
void f(const A<T,Len>& arr) {
    //...
}

您无需向此模板提供TLen;它们将从论证中推断出来:

f(arr)  //f<int, 10>
f(arr2) //f<int, 5>

当然,您可以在C ++ 11中使用std::array而不是自己编写,而不是重新发明轮子。