問題タブ [declval]
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++ - 特定の型の式を prvalue で呼び出すことができるかどうかをテストするにはどうすればよいでしょうか?
C++17 では、is_invocable
実際には値ではない派手な新しい prvalues と派手な新しい prvalues があります。
これにより、最初にオブジェクトを論理的に構築し、次に構築を省略せずにオブジェクトを作成できます。
何かを呼び出すことができるかどうかをテストするために使用std::is_invocable
すると、prvalue ルールが衝突するように見えるという問題に遭遇しました。
f
type の prvalue を使用して呼び出すことができるかどうかを尋ねることができますno_move
か?
std::is_invocable< decltype(&f), no_move >
type の prvalue ではないstd::declval<no_move>()
ような xvalue を使用するため、機能しません。no_move&&
no_move
c++14でもこれは同じでしたが、保証された省略により、一部の関数は xvalue (つまり " T&&
") で呼び出し可能になり、他の関数は type の prvalue で呼び出し可能になりT
ます。
代替手段はありますか、それともこのケースを処理するために独自の特性を発明する必要がありますか?
( の代わりにstd::declval<T>
返される理論的な世界では、正しいことをすると私は信じています)。T
T&&
is_invocable
c++ - typename の概念/SFINAE エラー
新しい概念の構文を使用して、自分用に簡単な例を作成しようとしています。型に operator() が定義されているかどうかをテストすることにし、SFINAE パラダイムを使用してこれをテストするための構造体を作成しましたが、型の問題が発生しています。これが私のコードです:
「typename」ポインターなしで開始しましたが、
return call_check<type_>::type;
、
しかし、名前依存の型エラーを受け取りました。タイプ名を追加した後、私は今受け取ります
concepts.h:20:78: error: ‘typename Templates::Concepts::call_check<yes>::type’ names ‘template<class type_> using type = decltype (check<type_>(nullptr))’, which is not a type
、
そして私は立ち往生しています。率直に言って、この SFINAE チェックを実装する最も正しい方法を完全には理解していないため、どこから始めればよいかわかりません。パラダイムおよび/または概念に関するヘルプもいただければ幸いです。
次のような例を見ました
std::declval<type_>()(std::declval<other>(), std::declval<op>()), ...
最初のチェック (二項演算子の場合) の decltype 呼び出しの最初の項目を置き換えましたが、それが関数呼び出しにどのように変換されるかを理解するのに苦労しました。(参考までに、上から3番目の回答:operator== が存在するかどうかを確認するには?)。
c++ - 関数ポインターの declval はありますか?
関数があり、特定の型の引数を渡すことができるかどうかをテストする必要があります。例えば:
呼び出しfoo<int, bar>()
は次の 2 つのことを行います。
- の戻り値の型を
foo
と同じ戻り値の型に設定しますbar
bar
型の引数を受け入れる関数であることを確認しますT
残念ながら、auto
テンプレートの種類にアクセスすることはできませんが、これらの両方を実現したいと考えています。私が必要としているのはdecltype
、関数ポインタ用です。これにより、次のようなことができます。
そのため、引き続き呼び出しfoo<int, bar>()
て同じ結果を得ることができました。もちろんdeclval
、関数ポインタには for はありません。しかし、これを達成できる別の方法はありますか?
c++ - declval を使用して未使用のリターンを作成できますか?
特殊化する予定のテンプレート化された関数があるとしましょう。そのため、基本的な実装はあまり気にしません。私はこのようなことをすることができます:
visual-studio-2017でこれを実行しようとすると、リンク エラーが発生します。
関数で参照されている未解決の外部シンボル
char const && __cdecl std::declval<char const >(void)
(??$declval@$$CBD@std@@YA$$QEBDXZ)char const __cdecl dummy<char const>()
繰り返しますが、この関数は呼び出されませんが、ポインターを保存します。代わりに使用できreturn T{}
、それはコンパイルされますが、のデフォルトのコンストラクターがない場合でもこれが機能する必要がありますT
。これを回避する方法はありますか?