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

StackOverflow https://stackoverflow.com//questions/12666761

Вопрос

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

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 и накладные расходы по времени компиляции?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top