Я видел, что @GMan реализовал версию sizeof...
для вариативных шаблонов, который (насколько я могу судить) эквивалентен встроенному sizeof...
. Разве это не противоречит второму принципу проектирования: предпочитать библиотеки к языковым расширениям?
Почему в С++ 0x есть оператор sizeof?
Ответы (2)
Из шаблонов Variadic (редакция 3) (N2080= 06-0150), стр. 6:
Хотя это и не является строго обязательным (мы можем реализовать
count
без этой функции), проверка длины пакета параметров является обычной операцией, которая заслуживает простого синтаксиса. Кроме того, эта операция может стать необходимой для проверки типов, когда вариативные шаблоны объединяются с концептами; см. раздел 3.3.
(Раздел 3.3 говорит о понятиях, которые сейчас неуместны.)
sizeof...
также можно одинаково хорошо применять к пакетам параметров шаблонов и функций. Так что sizeof...(T)
и sizeof...(t)
работают одинаково хорошо. Я полагаю, что решение на основе библиотеки будет работать либо с пакетами шаблонов, либо с пакетами параметров функций, но не с обоими. Потому что одно расширение создает последовательность типов, а другое — последовательность выражений. Может быть, написать его как template<size_t...> struct count;
, а затем передать пакет как count<sizeof(T)...>
может сработать. Поскольку sizeof
может обрабатывать как типы, так и выражения, казалось бы, это работает, но это явно уродливее :)
- person Johannes Schaub - litb; 09.05.2010
sizeof...
это просто сахар, я думаю.
sizeof
действительно является ядром языка, как и ...
, и хотя функция countof
может существовать, у нас уже есть зарезервированные sizeof
и ...
, поэтому мы могли бы также сделать так, чтобы было удобно получать подсчет.
Наоборот, если бы sizeof
и ...
не были зарезервированы, идея добавить такую вещь, вероятно, потерпела бы неудачу, потому что новые ключевые слова, как правило, не одобряются. (Чем меньше, тем лучше.)