は、次のコードを考えてみましょう:void_tとvariadicテンプレートを混在していますか?
template <class F, class... Args, class = std::void_t<>>
struct is_invokable
: std::false_type {};
template <class F, class... Args>
struct is_invokable<F, Args..., std::void_t<std::invoke_result_t<F, Args...>>>
: std::true_type {};
目標は、タイプF
の呼び出し可能なタイプArgs...
の引数を持つ呼び出し可能であるかどうかを指示することである形質を持つことです。
しかし、それはコンパイルに失敗:C++ 17でこれを行うには(エレガント)の方法は何
error: parameter pack 'Args' must be at the end of the template parameter list
?
まあ、よう
Args...
何かをラップするヘルパー
struct
(is_invokable_h
)とstd::tuple
の使用を提案します?そこにそれを置きます。 – BarryHuh。私はそのタイプがパックを最終的な位置に置くことを必要としていることに気付かなかった。関数は、デフォルトの引数を与えるか、またはそれらを推論することはできません。 –