模板化typedef上的Template函数

Template function over a templated typedef

本文关键字:Template 函数 上的 typedef      更新时间:2023-10-16

我有一个类,它接受两个模板参数:

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'd变量做一些事情。类似这样的东西:

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

如果您希望f采用任意类型和长度的As,请将其作为模板函数:

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,而不是重新设计轮子,而不是自己编写。