13

次の関数を検討します。

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

すべての引数/* SOMETHING */の合計を返すために代わりに置く最も簡単なことは何ですか?sizeof

例えばmyFunction(int, char, double) = 4+1+8 = 13

4

6 に答える 6

16
unsigned myFunction() {return 0;}

template <typename Head, typename... Tail>
unsigned myFunction(const Head & head, const Tail &... tail) {
    return sizeof head + myFunction(tail...);
}
于 2012-10-01T02:14:31.357 に答える
16

C ++ 17では、fold式を使用します。

template<typename... List> 
inline constexpr unsigned int myFunction(const List&... list)
{
    return (0 + ... + sizeof(List));
}
于 2016-03-18T18:38:21.010 に答える
4

このコメントと質問に対する次のコメントに基づいて、これを使用できます(注:完全にテストされていません)

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);
于 2012-10-01T02:16:38.847 に答える
3

2年遅れていますが、コンパイラによって計算されることが保証されている代替ソリューション(異なる構文を気にしない場合):

template < typename ... Types >
struct SizeOf;

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

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

使用されますconstexpr std::size_t size = SizeOf<int, char, double>::Value; // 4 + 1 + 8 = 13

于 2016-03-18T18:18:01.133 に答える
0

テンプレートの方法は次のとおりです。

#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;
}
于 2016-08-19T15:44:29.273 に答える
-3

私はちょうどそれを見つけました:

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

だが :

1)結果がすべてのコンパイラで常に同じになるという保証はありますか?

2)make_tupleはコンパイル時に作成してオーバーヘッドを発生させますか?

于 2012-10-01T02:20:06.400 に答える