Я настоятельно рекомендую схему поддержания и хранимые процедуры в управлении исходным кодом.
имеющие версию хранимые процедуры Хранения позволяет им откатываться, когда определено быть проблематичным.
Схема является менее очевидным ответом в зависимости от того, что Вы имеете в виду. Очень полезно поддержать SQL, который определяет Ваши таблицы в управлении исходным кодом для дублирования сред (prod/dev/user и т.д.).
Работает при использовании ссылок:
template<size_t n> double f(double (&c)[n]);
К сожалению, нет, потому что, когда вы передаете double c [5]
в f () или любой массив в любую функцию, которая принимает массив в этом отношении, вы теряете информация о размере. Вы просто передаете указатель.
Изменить: Но см. Ответ gf для обходного пути.
нет, потому что в другом вызове аргумент может исходить откуда угодно. компилятор определенно не может преследовать ваши указатели во время выполнения .
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;
}
Это может помочь вам в решении вашей более серьезной проблемы (какой бы она ни была). Это позволит вам запрашивать размер / тип массива при компиляции.
template < typename T_, unsigned N_ >
class many {
public:
typedef T_ T;
enum { N = N_ };
T array[N];
};
Justin