Размер вариадического шаблона (сумма размера всех элементов)
-
11-12-2019 - |
Вопрос
Учитывая следующую функцию:
template<typename... List>
inline unsigned int myFunction(const List&... list)
{
return /* SOMETHING */;
}
.
Какая самая простая вещь, чтобы поставить вместо /* SOMETHING */
, чтобы вернуть сумму генеракодицетагкода все аргументы?
Например генеракодицетагкод
Решение
unsigned myFunction() {return 0;}
template <typename Head, typename... Tail>
unsigned myFunction(const Head & head, const Tail &... tail) {
return sizeof head + myFunction(tail...);
}
. Другие советы
в C ++ 17, используйте выражение сгиба:
template<typename... List>
inline constexpr unsigned int myFunction(const List&... list)
{
return (0 + ... + sizeof(List));
}
. Исходя из Этот комментарий и следующие комментарии к вопросу, вы можете использовать это (Примечание: полностью непроверенная)
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);
. Два года поздно, но альтернативное решение, гарантированное компилятором (если вы не возражаете против другого синтаксиса):
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);
};
.
Используется в качестве генеракодицетагкода
Вот шаблон способа:
#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;
}
. Я только что нашел, что:
template<typename... List>
inline unsigned int myFunction(const List&... list)
{
return sizeof(std::make_tuple(list...));
}
.
Но:
1) У меня есть гарантия, что результат всегда будет одинаковым на всех компиляторах?
2) сделать make_tupple и накладные расходы по времени компиляции?