問題タブ [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.
c++ - 可変引数関数のすべての引数で std::forward を呼び出すにはどうすればよいですか?
私はちょうどジェネリック オブジェクト ファクトリを作成し、boost プリプロセッサ メタ ライブラリを使用して可変個引数テンプレートを作成していました (2010 を使用しており、それらをサポートしていません)。私の関数は rval 参照を使用std::forward
して完全な転送を行い、考えさせられました... C++ 0X が出てきて標準コンパイラがあれば、実際の可変個引数テンプレートでこれを行うでしょう。しかし、どうすればstd::forward
引数を要求できますか?
私が考えることができる唯一の方法は、 ...params の手動アンパックを必要とすることであり、私もまだそこにいません。動作するより高速な構文はありますか?
c++ - 可変引数コンストラクターは、暗黙的に生成されたコンストラクターを非表示にすることになっていますか?
可変引数コンストラクターは、暗黙的に生成されたコンストラクター、つまりデフォルト コンストラクターとコピー コンストラクターを非表示にすることになっていますか?
どういうわけか、この回答を読んだ後、これが何も出力しないことを期待していましたが、g ++ 4.5.0で2回出力inside the variadic constructor
されます:(この動作は正しいですか?
可変個引数テンプレートなしでも発生します。
ここでも、両方の行が印刷されます。
c++ - メンバー関数の複数の引数を自動的に処理するためのテンプレート boost::bind
関数オブジェクトを受け入れてコレクションに格納する「アタッチ」関数を持つクラスがあります。クラス自体は、関数シグネチャでテンプレート化されています。このようなもの:
使用法を示すために、次のクラスを検討してください。
関数を に渡すにはListening
、次のEvent
ように記述する必要があります。
したがって、エラーが発生しやすいケースごとにそうする代わりに、次のように一連のマクロを記述します。
そして、私は書くことができます:
これははるかに読みやすいです(私は思う)。今私の質問に:代わりにどのように書くことができますか:
またはさらに良い:
、イベント Attach が <Signature> に含まれる適切な数の引数 (この例ではint(int, int, int)
) で魔法のように正しくバインドされるように? 私は、あなたがここで考えているどんなテンプレート メタプログラミング マジックにもオープンです。
ありがとう。
boost::mem_fn
編集:ここでは必要ないことがわかりましたboost::bind
。同等であるため、マクロで使用できます:
、それ以外の:
&MyClass::Hello
ただし、問題は残ります。イベント クラスに渡し、テンプレートのオーバーロードを使用して、クラスのテンプレート化に使用される関数プロトタイプによって暗示された 、 、など_1
を_2
処理するにはどうすればよいでしょうか?_3
Event
c++ - 可変個引数テンプレート
可変個引数テンプレートを紹介するリンクをたくさん見てきました。しかし、私はこのアプローチを示すコンパイル可能な例を見たことがありません。
誰かがそのようなコンパイル可能な例を見つけることができるいくつかのリンクを私に提供できますか?
boost - 可変個引数テンプレート ベクトルの mpl スタイル copy_if メタ関数
通常のブースト mpl で正常に動作するメタ プログラムがあります。次のようになります。
可変個引数テンプレート ベクトル (mpl::vector) を使用してコンパイルしようとしています。そのために、ここにある可変個引数テンプレート ベクトルの実装を使用しています: https://svn.boost.org/svn/boost/sandbox/variadic_templates
いくつかのテストはありますが、レポで copy_if、remove_if、count_if の使用可能な実装を見つけることができませんでした。それらのメタプログラムはそこにありますが、私はそれらを見つけることができませんか? または、mpl プレースホルダーもサポートするように、そのうちの 1 つを実装するのを手伝ってくれませんか。事前にご協力いただきありがとうございます。
c++ - テンプレート パラメータ パックを展開せずに「保存」することはできますか?
この問題に遭遇したとき、私は C++0x 可変個引数テンプレートを試していました:
テンプレート パラメーター パックを typedef しようとすると、GCC 4.5.0 でエラーが発生します。
基本的に、パラメータパックを解凍せずにtypedefに「保存」したいと思います。出来ますか?そうでない場合、これが許可されていない理由はありますか?
c++ - 複数のテンプレート パラメーター パックによる部分的なテンプレートの特殊化
可変個引数テンプレートの世界への旅を続けると、別の問題に遭遇しました。
次のテンプレート クラスを想定します。
次のように、可変個引数テンプレートのインスタンス化に部分的に特化することができます。
これによりfoo< int >
、デフォルトの実装とfoo< std::tuple< int, char > >
特殊な実装に対応します。
ただし、複数のテンプレート パラメーターを使用すると、事態はさらに複雑になります。たとえば、次のテンプレート クラスがあるとします。
で行ったように、それを部分的に特化したいのですがfoo
、それはできません。
確かに、私が正しければ、テンプレート パラメーター パックは 1 つしか持てず、パラメーター リストの最後に配置する必要があります。テンプレート宣言でこれが必須である理由は理解していますが、特定の部分的なテンプレートの特殊化 (上記の例など) では、これは問題になりません。
複数のテンプレート パラメーター パックを使用して部分的なテンプレートの特殊化を実現することは可能ですか?
編集:今、私はばかげていると感じています...上記のコードは完全にコンパイルされます(少なくともgcc 4.5では)。コンパイル エラーは、複数のパラメーター パックが原因ではなく、メンバー関数のパラメーターとして使用されたことが原因でした。の部分的な特殊化で、とパラメータbar
の両方を受け取るメンバー関数を定義しようとしました。TArgs
UArgs
メンバー関数の宣言で、gcc がエラーを表示します
パラメータ パックは、パラメータ リストの最後にある必要があります。
私が知る限り、コンパイラは、特定のテンプレートのインスタンス化に対して正しいメンバー関数を定義できるはずです。たとえばbar< std::tuple< int, char >, std::tuple< float > >
、メンバー関数を含める必要がありますvoid method( int, char, float )
。私は何か間違ったことをしていますか?それとも、不可能なことをしようとしていますか? もしそうなら、これが不可能な正当な理由はありますか?
c++ - C++0x:参照なしで可変個のテンプレートパラメータを取得する方法は?
次の不自然な (そして、ひどい) 例を考えてみます。
次のように呼び出すと機能します。
ただし、次のように呼び出すと機能しません。
5 への代入のため。何らかの理由でタプルが定義されているときにタプルを初期化できないと仮定すると、型を参照として指定するときにこれを機能させるにはどうすればよいでしょうか?
具体的には、 isのstd::tuple<int>
場合でもタプルをしたいと思います。Args...
int&
これの実際のユースケースには、文字列をタプルに逆シリアル化することが含まれます。ここでArgs...
、タプルをアンパックすることによって呼び出される関数へのパラメーターの型です。関数が参照によってパラメーターを受け取る場合を除いて、すべてうまく機能します。
私は gcc 4.5.2 を使用していますが、このコンパイラにはまだ実装されていない回答を受け入れます。
c++ - 可変個引数テンプレートパラメータを別のタイプに変換します
タイプを可変個引数テンプレートパラメータから別のタイプに変換するにはどうすればよいですか?
例えば:
私はそう書きたいです:
そしてstd::tuple<std::vector<int>, std::vector<double>, std::vector<double>>
、構造体シーケンスを持っています。そしてそれからシングルを取得します。
std::vector<single<T...>>
1つのシーケンスをいっぱいにする必要があり、からコピーするのは簡単なので、私には悪い考えです。
出来ますか?
どうもありがとうございます。英語が下手でごめんなさい。
c++ - c++初期化子リストと可変個引数テンプレート
配列を作成したかった:
なぜコンパイルされないのですか?(g ++ 4.6でテスト済み)