Параметр шаблона C ++ в измерении массива - PullRequest
8 голосов
/ 17 ноября 2009

У меня есть следующий код, использующий шаблоны и размерность массива в качестве параметра нетипизированного шаблона

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 ]

30 голосов
/ 17 ноября 2009

Работает при использовании ссылок:

template<size_t n> double f(double (&c)[n]);
1 голос
/ 17 ноября 2009

К сожалению, нет, потому что когда вы передаете double c[5] в f () или любой массив в любую функцию, которая принимает массив в этом отношении, вы теряете информацию о размере. Вы только передаете указатель.

Редактировать: Но см. Ответ GF для обходного пути.

0 голосов
/ 17 ноября 2009

Это может помочь вам с вашей большой проблемой (что бы это ни было). Это позволит вам запрашивать размер / тип массива при компиляции.

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

    T array[N];
};

Justin

0 голосов
/ 17 ноября 2009

нет, потому что в другом вызове аргумент может приходить откуда угодно. конечно, компилятор не может преследовать ваши указатели во время выполнения .

edit: кстати, это работает для меня, но требует -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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...