問題タブ [invocable]
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++ - 任意の関数引数型を持つ is_invocable
std::is_invocable
次のような任意の関数引数タイプで使用する方法はありますかstd::is_invocable<Function, auto>
? アイデアはFunction
、引数のタイプに関係なく、1 つの引数を受け入れることができるかどうかを確認することです。auto lambda1 = [](auto x) {...}
ユースケースとして、 、auto lambda2 = [](auto x, auto y) {...}
、および高次のテンプレート化された関数の2 つのラムダを検討してください。
最初のケースの!std::is_invocable<Function, auto, auto>::value
は、オーバーロードされた関数のあいまいさを防ぐためです (つまり、この場合の優先される特殊化は、あいまいさの場合の 2 つの引数の 1 つです)。
auto
この場合、このように使用できないことを認識していることに注意してください。この動作を(少なくとも部分的に)実装する方法があるかどうかを尋ねています。
salesforce - Apex Select ステートメントを文字列に変換する方法はありますか
select ステートメントがある文字列 'Test' をハードコーディングできるため、すべての権限セットが正しく更新されていますが、select ステートメントを挿入すると、チャット ボットがすぐに閉じます。誰かが簡単に見てもらえますか?電子メール アドレスを取得し、連絡先オブジェクトを検索して appDecision (カスタム フィールド) を返すことができることをテストしようとしています。
}
c++ - 呼び出し可能なパラメーターの型が推定されるときに C++ 呼び出し可能な概念を指定する方法
テンプレート化された関数からテンプレート化されたラムダを呼び出すと、ラムダ パラメータの型が推定されます。ラムダのタイプが auto の場合、機能します: https://godbolt.org/z/WYxj5G8vx
私はstd::invocable
概念を使用して のauto fun
パラメーターを特殊化し、パラメーターとしてtestf2
受け取る callable 以外のものにしたいと考えましたstd::array<std::uint8_t, N>
。
試してみると、gcc11.2またはclang13を使用しています
エラーが発生します:
候補テンプレートは無視されました: テンプレート引数 'S' を推測できませんでした int testf2(T, std::invocable<std::array<uint8_t, S>> auto fun) {
auto のみが使用されている場合にコンパイラが型を推論できる理由がわかりませんが、制約の概念はありません。
この状況で概念を使用する正しい方法は何ですか?
これはコードの簡略化されたバージョンです。実際には、の署名とtestf2
配列testf2(auto fun, ARGS... args)
のサイズは、パラメーター パックの種類に基づいて計算されます。
============編集03/03/2022 ==================
正しい答えをありがとう、しかし私はコードと質問を単純化しすぎたので、間違った質問に対して正しい答えを得ました。
より多くのコンテキストが必要です。私はMCUで作業しており、スレーブペリフェラルにバッファを送信し、応答としてバッファを受信する、ある種のspi、i2c、modbusなどのトランザクションを抽象化する関数を作成したいと考えています。この関数は、書き込みおよび読み取りバッファーの長さを計算し、シリアル化 (必要に応じてエンディアン変換を行います)、ラムダを呼び出してトランスポート メカニズムに応じて実際のトランザクションを実行し、逆シリアル化して戻ります。したがって、提案されているように、バッファの長さを (sizeof(Ts) + ...) で計算することはできません。
私はより現実的な例を作りました: live example
質問は同じままです: 関数 testf2 の auto fun パラメータに制約を追加する方法はありますか?