Вот некоторые идеи получить более более простой дизайн:
Да, это на 100% законно и должно быть переносимым. Стандарт C ++ говорит об этом в 5.19 - Постоянные выражения "(выделено мной):
В некоторых случаях C ++ требует выражений, которые вычисляют целочисленную или перечисляемую константу: как границы массива (8.3.4, 5.3.4), как case -выражения (6.4.2), как длины битовых полей (9.6), как инициализаторы перечислителя (7.2), как инициализаторы статических элементов (9.4.2), и как целочисленные или перечисляемые аргументы шаблона, не являющиеся типами (14.3).
константное выражение: условное выражение
Целочисленное константное выражение может включать только литералы (2.13), перечислители, константные переменные или статические элементы данных целочисленного или перечислительного типов, инициализированные константными выражениями (8.5), параметры шаблона, не являющиеся типами интегрального или типы перечисления и выражения sizeof.
Тем не менее, похоже, что VC6 его не поддерживает. См. ответ StackedCrooked для хорошего обходного пути. Фактически, я обычно предпочитаю метод enum
, который StackedCrooked упоминает для этого типа вещей.
В качестве к сведению, метод « static const
» работает в VC9, GCC 3.4.5 (MinGW), Comeau и Digital Mars.
И не забывайте, что если вы используете член "static const", вам потребуется его определение в дополнение к объявлению строго Говорящий.
Такое поведение допустимо в соответствии со стандартом C ++. Любой последний компилятор должен поддерживать его.
Это стандартный C ++ уже более десяти лет. Он даже поддерживается VC - чего еще вы хотите? (@Neil: А что насчет SunCC? : ^>
)
Я считаю, что Visual Studio 2005 и выше его поддерживает. Также компилятор XCode C ++ (на самом деле это gcc).
Если вы хотите быть в безопасности, вы всегда можете использовать старый способ перечисления, который я узнал от Effective C ++. Это звучит так:
class Class {
private:
enum {
numberOfColors = 16
};
COLORREF colors[numberOfColors];
};
Надеюсь, это поможет.
Я почти уверен, что это также будет работать с gcc и Solaris, но я не могу проверить это на данный момент.
В будущем вы могли бы расширить эту идею следующим образом:
template<int size>
class Class {
private:
COLORREF colors[size];
};
и используйте его так:
Class<5> c;
, чтобы не ограничивать вас одним размером буфера в вашем приложении.
Я перестал беспокоиться о переносимости этой версии много лет назад. Возможно, еще существуют компиляторы, которые его не поддерживают, но в последнее время я не встречал ни одного из них.
Это правильный C ++, и большинство (все?) Современных компиляторов поддерживают его. Если вы используете ускорение, вы можете получить переносимую поддержку этой функции в виде макроса BOOST_STATIC_CONSTANT
:
class Class {
private:
BOOST_STATIC_CONSTANT(int, numberOfColors = 16);
COLORREF colors[numberOfColors];
};
Макрос расширяется до static const int numberOfColors = 16
, если компилятор поддерживает это, в противном случае используется enum {numberOfColors = 16};
.
На подобные вопросы можно ответить, сославшись на спецификацию ISO C ++, но эту спецификацию сложно понять и сложнее прочитать. Я думаю, что самый простой ответ зависит от двух вещей:
Помимо других ответов, вы можете использовать следующую функцию для определения количества элементов в статически размещенных массивах:
template<typename T, size_t length>
size_t arrayLength(T (&a)[length])
{
return length;
}