[解決済み] C++11: 変数型テンプレート関数のパラメータ数?
2023-01-13 10:18:44
質問
variadic テンプレート関数の引数の数を取得するにはどうしたらよいでしょうか。
すなわち
template<typename... T>
void f(const T&... t)
{
int n = number_of_args(t);
...
}
を実装するための最良の方法は何でしょうか?
number_of_args
を実装する最善の方法は何でしょうか?
どのように解決するのですか?
こう書けばいいんです。
const std::size_t n = sizeof...(T); //you may use `constexpr` instead of `const`
なお
n
は定数表現(つまりコンパイル時に既知)であるため、定数表現が必要なところでは、次のように使ってもよいでしょう。
std::array<int, n> a; //array of n elements
std::array<int, 2*n> b; //array of (2*n) elements
auto middle = std::get<n/2>(tupleInstance);
もし、パックされたタイプの集約されたサイズを計算したい場合、( 番号 ではなく)パックされた型の集計サイズを計算したい場合は、このようにしなければならないことに注意してください。
template<std::size_t ...>
struct add_all : std::integral_constant< std::size_t,0 > {};
template<std::size_t X, std::size_t ... Xs>
struct add_all<X,Xs...> :
std::integral_constant< std::size_t, X + add_all<Xs...>::value > {};
の場合は、こうします。
constexpr auto size = add_all< sizeof(T)... >::value;
C++17 (およびそれ以降) では、型のサイズの合計を計算するのは、より単純に 折り畳み 式を使ってより簡単に計算できます。
constexpr auto size = (sizeof(T) + ...);
お役に立てれば幸いです。
関連
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] 引数を可変個数でまわす
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】一致する関数ポインターを呼び出すためにタプルを「解凍」する
-
[解決済み】メンバ関数でスレッドを開始する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】変数やフィールドがvoid宣言されている