数组维度中的C ++模板参数

时间:2009-11-17 00:55:48

标签: c++ templates

我有以下代码使用模板和数组维度作为模板非类型参数

template<int n> double f(double c[n]);
...
double c[5];
f<5>(c);  // compiles
f(c);  // does not compile

编译器是否应该能够在没有显式模板参数的情况下实例化第二个f?我正在使用g ++ 4.1

4 个答案:

答案 0 :(得分:30)

使用引用时有效:

template<size_t n> double f(double (&c)[n]);

答案 1 :(得分:1)

不幸的是没有,因为当你将double c[5]传递给f(),或者任何数组传递给任何采用数组的函数时,你都会丢失大小信息。你只是传递一个指针。

编辑:但请参阅gf的答案以获得解决方法。

答案 2 :(得分:0)

不,因为在不同的电话中,争论可能来自任何地方。编译器肯定无法在运行时追逐你的指针

编辑:顺便说一句,这对我有用,但需要-std = c ++ 0x(我正在使用gcc 4.4)

#include <iostream>

template <int n>
struct T
{
    T&
    operator=(double const cc[n])
    {
        c = cc;
        return *this;
    }
    const double
    operator[](int const &i)
    {
        return c[i];
    }
    double c[n];
};

template<int n>
double
f(T<n> & x)
{
    return x[n-1];
}

int
main()
{
    T<5> t5 = {10, 20, 30, 40, 50};
    T<3> t3 = {100, 200, 300};
    std::cout << f(t5) << std::endl;
    std::cout << f(t3) << std::endl;
    return 0;
}

答案 3 :(得分:-1)

这可以帮助您解决更大的问题(无论可能是什么)。这将允许您在编译时查询数组的大小/类型。

template < typename T_, unsigned N_ >
class many {
public:
    typedef T_ T;
    enum { N = N_ };

    T array[N];
};

贾斯汀