可変引数関数における引数の型の均一性の確保
このシナリオでは、可変数の引数を受け入れることができる関数を作成することを目的としています。ただし、すべての引数が同じ型であることを確認してください。私たちは、配列やベクトルなどの追加のデータ構造に頼らずにこれを達成しようとします。
可変個引数関数
可変個引数関数自体は、引数の型安全性を提供しません。型の均一性を強制するには、可変個引数テンプレート関数の採用を検討してください。
可変個引数テンプレート関数
可変個引数テンプレート関数は次のように定義できます。
template<typename... Args> return_type function_name(Args...);
このテンプレートでは、Args... は関数に渡すことができる引数の可変数を表します。
型チェックの強制
すべての引数が同じタイプの場合は、SFINAE (置換失敗はエラーではありません) を使用できます。 SFINAE を使用すると、コンパイル中に指定された条件が true か false かを検出するテンプレートを作成できます。
例を次に示します。
template<typename R, typename... Args> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
このテンプレートでは、f() のみが許可されます。 ToType 型 (目的の引数の型を表す) に変換可能な引数を受け入れます。この構成では、ToType に変換できない引数はすべて拒否されます。
ユースケースの解決策
特定のユースケースでは、次のものが使用できます。
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
このテンプレートは、変数引数を std::array
SFINAE との組み合わせ
このアプローチと前述の SFINAE テクニックを組み合わせると、次のようなものを作成できます。 Maiden に変換できない引数を拒否するテンプレート。
以上が可変引数関数で型の均一性を強制するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。