コンテナを使用しない可変個引数関数またはテンプレートの単一の引数型の指定
可変個引数関数またはテンプレート関数を使用する場合、次のことが望ましい場合があります。すべての引数が特定の型に準拠していることを確認しながら、正しくない場合には明らかなコンパイル時エラーを表示します。
可変個引数関数
printf ファミリなどの可変個引数関数は、さまざまな型の可変数の引数を受け入れます。ただし、型安全性が欠如しているため、すべての引数に特定の型を適用することが困難になります。
可変個引数テンプレート関数
可変個引数テンプレート関数は、テンプレート型を通じて型安全性を提供できます。パラメータ。ただし、テンプレート パラメーター内で目的の型の配列またはベクトルを指定すると、関数シグネチャに不必要な複雑さが追加されます。
解決策: テンプレート メタプログラミング (SFINAE)
コンテナを使用せずに型を強制する場合、テンプレートのメタプログラミングと置換失敗はエラーではない (SFINAE) 手法を活用できます。簡略化した例を次に示します。
template<typename ToType, typename Arg> struct is_convertible { static constexpr bool value = false; }; template<typename ToType, typename FromType> struct is_convertible<ToType, FromType> : std::is_convertible<FromType, ToType> {}; template<typename ...Args> void f(Args...) { // Check if all arguments are convertible to the desired type typename std::enable_if< is_convertible<ToType, Args>::value && ... >::type...; }
この例では、is_convertible テンプレート メタ関数が各引数を ToType 型に変換できるかどうかをチェックします。その後、f 関数は SFINAE を使用して、すべての引数がこの条件を満たす場合にのみその使用を有効にします。
使用法
make_dragon_list 関数の型制約を強制するには、次を使用できます。 SFINAE は次のようになります:
template<typename ToType, typename ...Args> typename std::enable_if< is_convertible<ToType, Args>::value && ... >::type make_dragon_list(Args...);
このアプローチでは、コンパイラーはパスを渡す試みを拒否します。引数の型が正しくないため、明確で早期のエラー メッセージが表示されます。
以上がコンテナを使用せずに可変個引数関数またはテンプレートに単一の引数の型を強制する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。