Определение статических константных переменных шаблонного класса - PullRequest
2 голосов
/ 18 июня 2011

У меня есть векторный класс, в котором есть некоторые статические переменные типа const, например ZERO. Теперь, поскольку vector часто реализуется как шаблонный класс (и мой не является исключением), я вижу много этого кода:

template<> const Vector2<float> Vector2<float>::ZERO;
template<> const Vector2<float> Vector2<float>::UNIT_X(1, 0);
//... and so on, and then all code duplicated for other types (int, double, long double)
// including different sizes of the Vector (Vector2, Vector3, Vector4)

У меня вопрос, могу ли я сделать что-то подобное, чтобы избежать дублирования кода только для другого типа:

template <typename T, unsigned int SIZE>
const Vector<T, SIZE> Vector<T, SIZE>::ZERO;

Может ли это удовлетворить все будущие типы? Если нет, будет ли иметь значение, если я добавлю следующее, чтобы явно определить классы для различных типов:

template Vector<float, 2>;
template Vector<float, 3>;

До сих пор я тестировал его на Visual C ++ (2008), и он прекрасно компилируется и тесты проходят, но мне интересно, если это нестандартный код.

Ответы [ 2 ]

1 голос
/ 18 июня 2011

Нет, это совершенно законно и абсолютно Стандартно. Если вы хотите использовать статическую переменную в шаблонном классе, вы не сможете определить все возможные ее экземпляры - эти типы могут даже не быть именуемыми и, следовательно, специализируемыми. Следовательно, очень важно, чтобы у шаблонных классов были статические переменные, определенные для всех возможных применений.

0 голосов
/ 18 июня 2011

Все нормально.

Шаблоны - это своего рода способ сказать компилятору генерировать похожий код для разных типов.
Это именно то, для чего оно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...