問題タブ [stdtuple]
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::array関数の引数として
これは、関数の引数としてタプルを展開 (または「展開」) する方法の非常に優れた (私のものではない) 例です。
次に、これを次のように使用できます。
std::array
タプルにとても似ているので、どうやって同じことをすることができるかをさまよっていました。std::get<N>
で動作するstd::array
ので、このソリューションを変更するのは簡単だと思いました。しかし、このようなものは機能しません:
パーツの為お譲り致しstd::result_of<FT(Arg&&)>::type
ます。引数の型Arg&&
が間違ってresult_of
いて、フィールドがありませんtype
。タプルArgs&&...
が拡張されましたが、今では「繰り返される」必要がありますI
。result_of
返された型を差し引くことができるようにこれを行う方法はありますか?
また、「アンパック」するツールがあり、tuple
再帰的に(おそらく を使用して)構造などarray
を「アンパック」することは可能でしょうか?とが枝で、他の種類が葉であるある種の木?enable_if
tuple<array<int, 2>, tuple<array<double,3>, ...
tuple
array
c++ - std::make_map? 均一な初期化
以下の作品:
以下はしません:
追加の変数を使用せずに、make_tuple で作成されたタプル内のマップを初期化する方法はありますか?
c++ - 代替順序を持つカスタム型の std::tuple (または std::pair) を比較します。カスタムより小さい/比較関数をプラグインすることは可能ですか?
問題
A
自然な順序付け ( を持つoperator<
) と複数の代替順序付け (大文字と小文字を区別する、大文字と小文字を区別しないなど)を持つカスタム型があります。これで、std::pair
(またはstd::tuple
) からなる (1 つまたは複数の) ができA
ました。std::pair<A, int>
比較したいタイプの例を次に示しstd::pair<int, A>
ます。の比較関数をプラグインして、デフォルトの要素ごとの比較実装を使用して(または) を比較するにはどうすればよいですか?std::tuple<A, int, int>
std::tuple<int, A, int>
std::pair
std::tuple
A
コード
以下のコードはコンパイルされません。
operator<
に対して が定義されていないためですstruct A
。上記に追加するとLOCATION-1
、問題が解決します。
これで、 の別の順序付けができましたstruct A
。
operator<
元の for struct A
(大文字と小文字を区別するもの)を保持したい場合std::pair<A, int>
、この別の順序とどのように比較できるでしょうか?
operator<
forの特別なバージョンを追加するとstd::pair<A, int>
問題が解決することはわかっています。
ただし、これは次善の解決策だと思います。
まず、 の場合std::pair
、要素単位の比較を再実装するのは簡単ですが、それはstd::tuple
複雑で (可変個引数テンプレートの処理)、エラーが発生しやすい可能性があります。
第 2 に、これが問題を解決するためのベスト プラクティスの方法であるとはほとんど信じられません。operator<
次のクラスのそれぞれに対して の特殊なバージョンを定義する必要があると想像してください: std::tuple<A, int, int>
、std::tuple<int, A, int>
、std::tuple<int, int, A>
、std::tuple<A, A, int>
... (これは実際的な方法でさえありません) !)
operator<
よく書かれた組み込みのforを再利用し、私の forstd::tuple
をプラグインすることは、私が望むものです。出来ますか?前もって感謝します!less-than
struct A
c++ - 左辺値の完全な転送の失敗
タプルを反復処理し、要素ごとにその要素で関数を呼び出し、最後にすべてのタプル要素の結果で別の関数を呼び出すユーティリティ関数があります。
わかりやすく説明すると、次のようになります。
- いろいろな種類のタプルがある
tuple<Foo<int>, Bar<double>, Baz<char>>
- 各型
Foo
にはBar
、何らかの内部メンバーへの参照を返すBaz
暗黙のインターフェースがあります。ClassT::data()
T&
- 署名付きの関数があります
void (int, double, char)
このユーティリティは、タプル メンバーを反復処理して内部メンバーへの参照を抽出し、必要なパラメーターを指定して関数を呼び出します。
問題: 完全転送
いわゆる「ユニバーサル参照」と完全な転送を使用してユーティリティを実装しようとしました。これにより、複数の左辺値/右辺値および const/非 const オーバーロードの必要性がなくなりました。
関数へのパラメーターは型ですが、
左辺値をそれにバインドできません。どうしてこれなの?
これに至るまで同様の質問をここで行いましたが、解決されました。ただし、これは無関係の問題であるため、これには新しい質問が必要だと思います
ideone の例: https://ideone.com/lO5JOB
c++ - C++ で可変個引数テンプレート クラスから派生する方法
std::tuple の単なるラッパーである可変個引数テンプレート クラスがあります。
からクラスを正しく派生させるにはどうすればよいTpl
ですか?
コンパイラ (VS14 CTP 6) のメッセージは次のように表示されます。
templates - タプルとベクトルに対して再帰的な非 void 関数テンプレート
数値のサインを計算する関数を作成しました。の場合、入力タイプを返しますstd::is_floating_point
。しかしstd::is_integral
、 の場合は を返しますdouble
。
簡単です。vector
これをs (または配列) とtuple
s (またはクラスター)で機能させたいと思います。となることによって:
テンプレートに関するほとんどの例tuple
では、関数は戻り値を持たないか、累積値を返すか、または入力と同じ戻り値の型を持ちます。
私はこれらのトピックで多くのことを実験してきました (とりわけ) : +11 (STL)?
最後のものは特に役に立ちました。これはtuple
s では機能しますが、再帰tuples
( tuple
s in tuple
s ) では機能しません。
最終的に (これが可能であれば)、 、 、 などを作成する必要がありますmycos
。gcc mytan
4.9.2myasin
を使用します。
**編集:**これは、Yakk の提案と少しの調整の後に思いついたものです。
これは機能します。C++14 が必要です。
c++ - タプルをループするテンプレート
私は可変個引数テンプレートで遊んでいて、現在operator<<
タプルを実装しようとしています。
次のコードを試しましたが、コンパイルされません (GCC 4.9 with -std=c++11)。
エラー メッセージは非常に不可解で長いですが、基本的には、get に一致する関数呼び出しがないことを示しています。誰かが私に理由を説明できますか? ありがとう。
編集:これが私が使用しているテンプレートのインスタンス化です
c++ - typename の各要素の const ref 修飾子を削除する方法... T
可変数の引数を持つオーバーロードのコードの重複 (または醜いマクロ) を避けるために、古いテンプレートの一部を可変長バージョンに置き換え始めました。
私が遭遇し、まだ解決されていない問題の 1 つは、次のとおりです。
これが私の例です:
古いソリューションでは引数の数ごとにバージョンが必要だったので、可変引数のソリューションに置き換えたいと思います。
残念ながら、可変長バージョンは失敗します
なぜなら tN は
しかし、それは明らかにする必要があります
私が働くために。
どんなアイデアも歓迎します:)
c++ - C++: type をマップ キーとして使用すると、テンプレート置換エラーが発生します
マップ内の要素を追跡するためのキーとしてタプルを使用し、後でマップを反復処理してマップの文字列バージョンを生成しています。変換を支援するために、キーとして使用されるタプルを連結するテンプレートの便利な関数があります (この回答に触発されました)。
要素をマップに挿入し、エラーなしで繰り返すことができます
しかし、マップを反復しようとすると、置換エラーが発生します。
生産 (OSX 上の g++ 4.2.1、余分な enable_if のメモを削除)
エラーメッセージにあるように、使用したいテンプレートは、置換の失敗により無視されました。マップに移動したときにどのような違いが生じましたか? また、どのように修正しますか?