Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.222.179.186] |
|
Сообщ.
#1
,
|
|
|
Всем привет! Можно этот неработающий код заменить каким либо костылём?
...отличным от size = 2 * 2 * 2 = 8 const WORD power ( BYTE base, BYTE exponent ) { WORD value = base; for ( BYTE index = 1; index < exponent; index ++ ) value *= base; return value; } const BYTE base = 2, exponent = 3; const WORD size = power ( base, exponent ); BYTE list [ size ]; |
Сообщ.
#2
,
|
|
|
А нужна степень двойки или чего угодно?
|
Сообщ.
#3
,
|
|
|
constexpr же
#include <iostream> using namespace std; constexpr int power(int base, int exponent) { return (exponent == 1) ? base : (base * power(base, exponent - 1)); } int main() { int list [power(2, 3)]; cout << sizeof(list) / sizeof(int); return 0; } |
Сообщ.
#4
,
|
|
|
шаблонами пробовал - тоже не хочет компилироваться
MBo, ...степень чего угодно, иначе можно было бы << использовать jack128, constexpr - крутая штука, но в Visual C++ 2010 Express не определена видимо числом придётся задать или переезжать на 2015, если нет конечно ещё какого-то способа? |
Сообщ.
#5
,
|
|
|
Без constexpr так должно сработать.
#include <iostream> template<int N, int P> struct Power { const static int value = Power<N, P - 1>::value * N; }; template<int N> struct Power<N, 0> { const static int value = 1; }; int main() { int a[Power<3, 4>::value]; std::cout << sizeof(a) / sizeof(int); } |
Сообщ.
#6
,
|
|
|
работает! Может так можно и статические массивы произвольной размерности делать?
|
Сообщ.
#7
,
|
|
|
Цитата FateFlex @ статические массивы произвольной размерности http://ru.cppreference.com/w/cpp/container/array но едва ли это есть в VS2010 |
Сообщ.
#8
,
|
|
|
Цитата FateFlex @ Может так можно и статические массивы произвольной размерности делать? Что это за зверь такой? Power<3, 4>::value заменяется на константу во время компиляции, соответственно и размер массива ты можешь сделать таким, какой ты можешь сделать простым заданием его размера. |
Сообщ.
#9
,
|
|
|
Цитата OpenGL @ Что это за зверь такой? Видимо многомерные массивы. Типа int x[1][1][1]; |
Сообщ.
#10
,
|
|
|
имею ввиду многомерный массив, получается гиперкуб, размерностью 1 - число (например BYTE[1]), размерностью 2 - квадрат (например BYTE[2][2] A), размерностью 3 - куб (например BYTE[3][3][3] A), и так далее (например BYTE[N]...[N])...
некий шаблон многомерного массива/матрицы T с указанием типа и размерности (числа координат, осей): T<BYTE,3> A; A[0][1][2] = 1; A[2][1][0] = 27; Вообще можно это всё представить одномерным массивом и считать смещения, а было бы здорово просто обращаться по координатам (индексам). Добавлено Алексей_Л, в 2010 нет, но логику из поздних версий можно подсмотреть, спасибо за ссылку. |
Сообщ.
#11
,
|
|
|
А, точно, размерность же, а не размер Да, конечно, её тоже можно сделать - написать шаблон вида template<class T, int N, int Dim> struct Array;, а затем специализировать следующим образом
1) Когда Dim = 1 это просто класс-враппер над обычным массивом, т.е. всякие operator[] для него будут возвращать T& / const T& 2) Для остальных случаев - в виде класса, operator[] которого возвращает ссылку на Array<T, N, Dim - 1>. |