構造を追加せずに可変個引数関数で型の一貫性を確保するにはどうすればよいですか?

DDD
リリース: 2024-11-13 12:59:02
オリジナル
948 人が閲覧しました

How to Enforce Type Consistency in Variadic Functions Without Additional Structures?

構造を追加せずに可変個引数関数で型の一貫性を確保する

可変個引数関数と可変個引数テンプレート関数を使用すると、可変個の引数を関数に渡すことができます。関数。ただし、すべての引数が同じ型であることを確認するのは困難な場合があります。この質問では、配列、ベクトル、または構造体を使用せずにこの問題の解決策を検討します。

可変個引数関数のアプローチ

提案された解決策は、可変個引数テンプレートと変換時に型チェックで妥当性を検証させます。ただし、このアプローチでは、目的の型への既知の変換パスが必要です。この場合、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート