問題タブ [enable-if]
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++ - テンプレート パラメーターを使用してデータ メンバーを追加/削除しますか?
次のコードを検討してください。
このコードでは、テンプレート パラメーターAddMembers
を使用して、クラスに関数を追加できますtrue
。そのために、 を使用しstd::enable_if
ます。
私の質問は次のとおりです:データメンバー変数に対して同じことが可能ですか(おそらくトリックを使用)? MyClass<false>
( 1 つのデータ メンバー ( myVariable
) とMyClass<true>
2 つのデータ メンバー (myVariable
および) を持つような方法でaddedVariable
?
c++ - ジェネリック型に特化した関数グループ
休眠コードはgcc4.7で動作します。アイデアは、シーケンス、ポインター、タプル、ペア、ユーザー定義型などで機能するこれらの総称関数を持っているということです。これらの関数の1つが型に対して定義されている場合、すべてが定義されている必要があります。私が抱えている問題は、それらをどのように専門化するかを決定することです。タイプごとに特化したテンプレートクラスを定義し、各関数を実装してから、クラス内の実装に転送するだけの無料の関数を定義することにしました。
私がやりたいのは、より一般的な型にMonを特化することですが、enable_if継承トリックを再度使用しようとすると、gccはMonがすでに定義されていると文句を言います。この質問で述べたように、2番目のテンプレート引数をSFINAEのtrue_またはfalse_typeにする手法も試しましたが、コンパイルすることができませんでした。
理想的には、アクションを定義したいタイプのカテゴリを考えるときはいつでも、enable_ifを記述して、関数のグループ全体をテンプレートの特殊化に記述できる必要があります。これにより、関数ごとに1つのenable_ifを作成する手間が省けます。悲観的に、私は本当に一般的であるために、各カテゴリーのすべてのもっともらしいタイプのためにグループを専門化する必要があるでしょう。
これを一般的で拡張可能な方法で書くことはできますか?
PS:コンセプトだけがC++11の一部だったとしたら。
c++ - boost::enable_if MSVC
で期待どおりにコンパイルして実行し、でコンパイルしgcc
ないコードがあります。MSVC 2012 RC
理由を説明できないので、でのバグMSVC
ですか、それともコードが正しくありませんか?
http://liveworkspace.org/code/45d78872a2c7f30192277a81c655b471
MSVC によると、push_back
とat
は のメンバーではありませんSome<vect_t>
。
編集。
MSVC 2012 のバグのようです。
にできないエラーが発生するため、特殊化ではなく一般的なケースを選択しますpush_back
int
...std::vector<boost::mpl::vector<int, double> >
編集。
奇妙な...しかし、これは期待どおりに機能します
そのため、理由を説明することはできませんが、MSVC 2012 は、enable_if (またはおそらくテンプレート パラメーター) でネストされた式を使用できません。
c++ - std::enable_ifまたはイテレータまたはポインタのSFINAE
引数を取るコンストラクターを書きMyClass
たいのですが、引数がapointer
またはiterator
(何かを持っているiterator_traits
)の場合にのみこれをコンパイルしたいと思います。これを達成する方法は?
c++ - 現在の型を除く Base から派生したすべての型で利用可能な暗黙のコンストラクター?
次のコードは私の問題を要約しています:
サンプルコードのように明示的なコンストラクターが既にあることを考慮して、テンプレートパラメーターに関係なく、現在のクラスを除いて、親クラスから派生したすべてのクラスに暗黙的なコンストラクターを制限する方法は?
編集: Base からの暗黙のコンストラクターについては、明らかに次のように記述できます。
しかし、その場合、コンパイラがこのコンストラクタを暗黙のコンストラクタとして使用しないという保証はありDerived2<OtherParameter1, OtherParameter2, OtherParameter>
ますか?
EDIT2:ここにテストがあります:(ここのLWS: http://liveworkspace.org/code/cd423fb44fb4c97bc3b843732d837abc )
最後の行が気になります。C++標準で大丈夫ですか?g++ のバグですか?
c++ - エラーの原因となるコンストラクターのC++型特性
単一の引数を取り、その引数の型::t
に他の型のサブタイプでなければならないメンバー型がある場合にのみ有効になるコンストラクターが必要です。私はこれに型特性を使用しており、コードは次のようになります。
ただし、g++は次のように文句を言います。
私は何を間違えましたか?
c++ - これらの関数テンプレートのいずれかがインスタンス化と一致しないのはなぜですか?
次のコードは、Intel C++2013でコンパイルできません。
エラー出力は次のとおりです。
どこが間違っているのですか?
c++ - 怠惰なenable_ifが仕事で寝ていますか?
以下に示す定義では、G++ (4.7.2) を呼び出しqget<0>()
たり使用したりできますが、「より高い」はエラーで失敗します。一方、Clang++ (3.2) は、それらのいずれでも失敗します。私は最後の手段として、怠惰なenable_if を使用しました。私はそれを必要とすべきではないと思いますが。コードが少し奇妙に見えることはわかっていますが、エラーの原因を特定できる人はいますか? (Boost は enable_if クラスを提供します。)qget<1>()
qget<2>
no matching function
c++ - enable_if を使用したクラス テンプレートのメンバー関数のオーバーロード
Foo<T>::bar()
次のような特定のタイプのメソッドをオーバーロードしようとしてT
います-成功しません。ポインタと回避策をいただければ幸いです。
これをideoneでコンパイルすると、次のコンパイラ エラーが発生します。
c++ - std ::enable_if2番目の質問
私はstd::enable_ifにまったく慣れておらず、それをどのように使用するのか疑問に思っています。テンプレートクラスがあります:
テンプレートにメンバーcを持たせたいのは
std :: enable_ifを使用してこれを行うにはどうすればよいですか?これはstd::enable_ifを使用する正しいケースですか?