У меня есть следующий код, который я использую для получения размера всех примитивных типов в пакете (я обрабатываю поплавки и удваивает особым образом), но моя программа не скомпилируется, когда пакет пуст.Как обрабатывать случай с пустым пакетом параметров
// terminating general case for T being anything else
template <class T>
size_t getSize()
{
return sizeof(T);
}
// terminating special case for T=double
template<>
size_t getSize<double>()
{
return SIZEOF_DOUBLE;
}
// terminating special case for T=float
template<>
size_t getSize<float>()
{
return SIZEOF_FLOAT;
}
// recursive case
template <class T, class U, class ...S>
size_t getSize()
{
return getSize<T>() + getSize<U, S...>();
}
Я хочу getSize
вернуться 0
при вызове как
template <class ...T>
void foo(T... arg)
{
size_t sizeOfTypes = getSize<T...>();
}
с T={}
, т.е. foo
называется как foo<>();
.
Обратите внимание, что я не хочу изменять способ вызова foo
, угловые скобки должны оставаться там. Предпочтительно, я хотел бы изменить getSize
, потому что я использую его в нескольких функциях, кроме foo
. Измените foo
в качестве последнего средства.
Вы даже можете использовать 'std :: accumulate'. – Jarod42
Красота рекурсии шаблонов исчезла, да. На самом деле, есть ли какие-либо преимущества в итерации с инициализационным списком по моему рекурсивному подходу к шаблону, кроме того, что он исправляет проблему, которую я имею? –
@FlyingHat Это ИМО чище и понятнее. И проще в компиляторе, потому что он должен создавать меньше шаблонов. –