問題タブ [variadic-templates]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
624 参照

c++ - 単純な可変個引数テンプレート関数はインスタンス化できません

が C++0x のパックされたテンプレート引数リストの型の数を生成することは承知していsizeof...(Args...)ますが、デモンストレーション目的で他の機能に関してそれを実装したかったのですが、コンパイルされません。

*HERE*でのこのエラー

つまり、最初に定義された基本ケースが表示されません。前方宣言template<typename...T>num_args();は、オーバーロードの解決にあいまいさをもたらします。

gcc 4.6 を使用しています。どうすればこれを機能させることができますか?

ありがとう。

0 投票する
3 に答える
2295 参照

c++ - この可変長関数があいまいであるのはなぜですか?

これは私の以前の投稿に関連しています。試みた 1 つの解決策がうまくいかなかった理由を知りたいです。

たとえば、呼び出そうとするとnum_args<int,float>()、関数呼び出しがあいまいであるというエラーが表示されます。

  • T={int,float} の A
  • H=int、T={float} の B

これがあいまいである理由がわかりません。A は宣言であり、B は A によって宣言された関数の定義です。

私はこの例を機能させようとしていますが、以前の質問への回答は、決して機能しないと主張しているようです。

その場合、可変長自由関数のポイントは何ですか? 彼らは何ができますか?

0 投票する
2 に答える
167 参照

c++ - これらの2つの可変個引数関数の本質的な違いは何ですか?

単純な可変個引数テンプレート関数に不満を感じています。

上記はコンパイルされません。詳細については、上記のリンクされた質問とフォローアップを参照してください。ただし、次の関数はコンパイルされます。

どちらも同じ言語メカニズムを使用しているようですが、2番目のメカニズムが優れているのに、なぜ最初のメカニズムが悪いのでしょうか。

0 投票する
1 に答える
144 参照

c++ - 可変個引数テンプレート-コンパイルエラー

次のコードのコンパイルエラーを修正するのを手伝ってもらえますか?

エラーが発生しました。呼び出しに一致する関数がありません

注:候補者は次のとおりです。

gccバージョン4.4.3(Ubuntu 4.4.3-4ubuntu5)

ありがとうsuresh

0 投票する
2 に答える
238 参照

c++11 - bindと一緒に使用した場合のis_base_ofの誤った動作

可変個引数テンプレート引数を単純なテンプレート引数と一緒に使用すると、バインドされたファンクターからインスタンス化されたときにis_base_ofの奇妙な動作が発生しまし

コードは次のとおりです。

プログラムの出力は次のとおりです。

しかし、私は期待します:

可変個引数テンプレートを間違った方法で使用していますか?Argsのような可変個引数型リストの最初の型を取得する他の(正しい)方法はありますか?バインド式で使用した場合にのみ問題になるのはなぜですか?

基本テンプレートを変更してテンプレートパラメータを1つだけにする場合、バインド式は機能することに注意してください。

0 投票する
5 に答える
23383 参照

recursion - パラメータパックの内容を出力するための再帰可変個引数テンプレート

パラメータパックの内容を印刷するために再帰的な可変個引数テンプレートを作成するにはどうすればよいですか? 私はこれを試していますが、コンパイルに失敗します:

再帰を終了するにはどうすればよいですか?

0 投票する
2 に答える
361 参照

variadic-functions - 可変個引数マクロを可変個引数テンプレート関数に変換しますか?

次の形式の可変個引数マクロを指定します。

-これを可変個引数関数テンプレートに書き直すにはどうすればよいですか?

Args更新::&&またはまたは何の参照タイプを宣言する方法に特に興味がありますconst&か?

更新:FTypeは「プレーンな」関数ポインターであると想定されていることに注意してください。

0 投票する
2 に答える
3369 参照

c++ - C++11 可変個引数テンプレートを使用したコンパイル時のクイック ソート

C++11 可変個引数テンプレートを使用してコンパイル時に評価することで、クイック ソート アルゴリズムを実装しました。ただし、データ セットが大きすぎると、パフォーマンスの問題が発生します。

データセットが TEST_DATA_100 の場合、コンパイルに 1.7 秒かかります。
データセットが TEST_DATA_1000 の場合、コンパイラが停止しているようです....

gcc 4.6.0 を使用しています。

0 投票する
9 に答える
68942 参照

c++ - パックされた可変個引数テンプレートの引数リストを反復処理するにはどうすればよいですか?

パックの可変個引数テンプレートの引数リストを反復処理する方法を見つけようとしています。すべての反復と同様に、パックリストに含まれる引数の数を知るための何らかの方法が必要です。さらに重要なのは、パックされた引数リストからデータを個別に取得する方法です。

一般的な考え方は、リストを反復処理し、int型のすべてのデータをベクトルに格納し、char *型のすべてのデータをベクトルに格納し、float型のすべてのデータをベクトルに格納することです。このプロセスでは、引数が入った順序の個々の文字を格納する個別のベクトルも必要です。たとえば、push_back(a_float)を実行すると、単に格納するpush_back('f')も実行されます。データの順序を知るための個々の文字。ここでstd::stringを使用して、単に+=を使用することもできます。ベクトルは単なる例として使用されました。

さて、物事の設計方法は、悪意にもかかわらず、関数自体がマクロを使用して構築されることです。これは実験であるため、必須です。したがって、再帰呼び出しを使用することは文字通り不可能です。これは、これらすべてを格納する実際の実装がコンパイル時に拡張されるためです。マクロを元に戻すことはできません。

考えられるすべての試みにもかかわらず、私はまだこれを実際に行う方法を理解することに固執しています。その代わりに、型を作成し、その型をvaradicテンプレートに渡し、ベクトル内で展開して、それを単純に繰り返すという、より複雑な方法を使用しています。ただし、次のような関数を呼び出す必要はありません。

だから本当の問題は、どうすればそのようなことなしにできるのかということです。コードが実際に何をしているのかをよりよく理解できるように、現在使用している楽観的なアプローチを貼り付けました。

これは厄介なことですが、これは純粋な実験であり、本番コードでは使用されません。それは純粋にアイデアです。それはおそらくもっと良い方法で行われる可能性があります。しかし、このシステムをどのように使用するかの例:

Pythonによく似ています。それも機能しますが、唯一の問題はこの関数をどのように呼び出すかです。ここに簡単な例があります:

非常に美的である新しい任意のタイプを構築する必要がありますが、それはそれらのマクロもそうではないということではありません。要点はさておき、私は次のオプションを実行したいだけです:foo(1000);

私はそれができることを知っています、私はある種の反復メソッド、またはもっと重要なことに、パックされた可変個引数テンプレート引数リストのためのいくつかのstd::getメソッドが必要です。私はそれができると確信しています。

また、私はint、float、char *のみをサポートしているので、これが正確にタイプフレンドリーではないことをよく知っています。それは私にとっては問題ありません。他に何も必要ありません。type_traitsを使用して、渡された引数が実際に正しいものであることを検証するチェックを追加して、データが正しくない場合にコンパイル時エラーを生成します。これは純粋に問題ではありません。また、これらのPODタイプ以外のサポートも必要ありません。

マクロとPODのみのタイプの純粋に非論理的で愚かな使用についての議論とは対照的に、建設的な助けを得ることができれば非常に高く評価されます。私は、コードがいかに壊れやすく壊れているかをよく知っています。これは実験的なものであり、後で非PODデータの問題を修正して、よりタイプセーフで使いやすくすることができます。

ご理解のほどよろしくお願いいたします。お役に立てることを楽しみにしております。

0 投票する
2 に答える
13662 参照

c++ - 前方宣言テンプレート関数の必要性

最近、このサンプルコードを作成して、C++11可変個引数テンプレート関数の使用法を説明しました。

前方宣言する最初の2行をfoo省略すると、int:123int:123代わりにこれが出力されます。これは、特定の経験豊富で知識豊富なC++プログラマーを驚かせました。

彼は、2フェーズルックアップの第2フェーズまでボディがインスタンス化されないため、前方宣言は必要ないと確信していました。彼は、コンパイラ(gcc 4.6)にバグがあると考えています。

foo2つは異なるベーステンプレート関数であり、ベーステンプレートの選択は最初のフェーズでロックインする必要があるため、コンパイラは正しいと思います。そうしないと、fooすべてのバージョンが定義される前にインスタンス化することで、単一定義規則に違反する可能性があります。そしてその後も(リンカが冗長なテンプレート関数定義が同一で、交換可能で、破棄可能であるとどのように想定するかを検討してください)。

それで、誰が正しいのですか?


上記のリンクされたGOTWは、関数テンプレートが部分的に特殊化されない方法と理由をうまく説明していますが、可変個引数テンプレート関数の存在は混乱を助長しているようです-foo<int,Tail...>部分的に特殊化されるべきfoo<Head,Tail...>直感は、非少なくとも私にとっては、可変個引数関数。