2016-04-18 5 views
5

В следующем примереСохранение количества аргументов шаблона в VARIADIC шаблона

template <size_t... Entries> 
struct StaticArray 
{ 
    enum {N = sizeof...(Entries)}; 
    size_t array[N] = {Entries...}; 
}; 

хранящее количество записей в enum больше похоже на хак мне.

Действительно ли это учебник способ хранения количества записей или есть более чистый способ сделать это?

+1

"Сохранение" является нечетным способом положи это. Хранилище не используется, а шаблоны C++ - это все объявления. Поэтому 'N' является скорее псевдонимом, чем чем-либо еще. Сказав это, я согласен с ответом @ Барри: 'enum' - не лучший механизм. – rici

+1

«enum hack» было в буквальном смысле общим названием этого, так что вам должно что-то сказать :-) –

ответ

6

Я предпочел бы static constexpr члена:

template <size_t... Entries> 
struct StaticArray 
{ 
    static constexpr size_t N = sizeof...(Entries); 
    size_t array[N] = {Entries...}; 
}; 

Возможно, с кучей других функций constexpr членов (size(), begin(), end(), data() и т.д.)

+0

+1, перехват 'enum' больше не нужен, теперь у нас есть' constexpr' (и, честно говоря, возможно до этого во многих практических ситуациях). до тех пор, пока ваша программа не принимает адрес 'constexpr', он будет вложен как литерал (любым полуподобным компилятором yadda yadda). –