Размер шаблона вариации (сумма размеров всех элементов)

Учитывая следующую функцию:

template<typename... List>
inline unsigned int myFunction(const List&... list)
{
return /* SOMETHING */;
}

Что проще всего поставить вместо /* SOMETHING */ чтобы вернуть сумму sizeof все аргументы?

Например myFunction(int, char, double) = 4+1+8 = 13

6

Решение

unsigned myFunction() {return 0;}

template <typename Head, typename... Tail>
unsigned myFunction(const Head & head, const Tail &... tail) {
return sizeof head + myFunction(tail...);
}
13

Другие решения

В C ++ 17 используйте выражение сгиба:

template<typename... List>
inline constexpr unsigned int myFunction(const List&... list)
{
return (0 + ... + sizeof(List));
}
6

Основано на этот комментарий и следующие комментарии по этому вопросу, вы можете использовать это (примечание: полностью не проверено)

std::initializer_list<std::size_t> sizeList = {sizeof(List)...}; //sizeList should be std::initializer_list, according to the comments I linked to
return std::accumulate(sizeList.begin(), sizeList.end(), 0);
4

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

template < typename ... Types >
struct SizeOf;

template < typename TFirst >
struct SizeOf < TFirst >
{
static const auto Value = (sizeof(TFirst));
};

template < typename TFirst, typename ... TRemaining >
struct SizeOf < TFirst, TRemaining ... >
{
static const auto Value = (sizeof(TFirst) + SizeOf<TRemaining...>::Value);
};

Используется в качестве const int size = SizeOf<int, char, double>::Value; // 4 + 1 + 8 = 13

2

Вот шаблонный способ:

#include <iostream>

template<typename T, typename ...Ts>
class PPackSizeOf
{
public:
static const unsigned int size = sizeof(T) + PPackSizeOf<Ts...>::size;
};template<typename T>
class PPackSizeOf<T>
{
public:
static const unsigned int size = sizeof(T);
};

template<typename ...Ts>
class FixedSizeBlock
{
private:
char block[PPackSizeOf<Ts...>::size];
public:

};

int main( )
{
FixedSizeBlock<char,long> b;
std::cout << sizeof(b) << std::endl;
return 0;
}
0

Я только что обнаружил, что:

template<typename... List>
inline unsigned int myFunction(const List&... list)
{
return sizeof(std::make_tuple(list...));
}

Но :

1) Есть ли у меня гарантия, что результат всегда будет одинаковым на всех компиляторах?

2) make_tuple будет делать и накладные расходы во время компиляции?

-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector