構造を追加せずに可変個引数関数で型の一貫性を確保する
可変個引数関数と可変個引数テンプレート関数を使用すると、可変個の引数を関数に渡すことができます。関数。ただし、すべての引数が同じ型であることを確認するのは困難な場合があります。この質問では、配列、ベクトル、または構造体を使用せずにこの問題の解決策を検討します。
可変個引数関数のアプローチ
提案された解決策は、可変個引数テンプレートと変換時に型チェックで妥当性を検証させます。ただし、このアプローチでは、目的の型への既知の変換パスが必要です。この場合、Maiden の配列を Dragon_list_t に変換する既知の方法が必要です。
例:
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
SFINAE アプローチ
SFINAE (置換失敗はエラーではありません) を使用して強制できます。関数インターフェイスレベルでの型の一貫性。これにより、オーバーロード解決プロセスの早い段階で無効な引数を拒否できます。
例:
template<typename R, typename...> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
結論
どちらのアプローチでも、追加のデータ構造を使用せずに、可変個引数関数に渡されるすべての引数に対して 1 つの型を指定する方法が提供されます。可変個引数関数のアプローチは既知の変換パスに依存しますが、SFINAE のアプローチではオーバーロード解決により無効な引数を拒否できます。これらのアプローチのどちらを選択するかは、特定の使用例の要件によって異なります。
以上が構造を追加せずに可変個引数関数で型の一貫性を確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。