可変引数関数で型の均一性を強制するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-10 04:30:02
オリジナル
280 人が閲覧しました

How to Enforce Type Uniformity in Variadic Functions?

可変引数関数における引数の型の均一性の確保

このシナリオでは、可変数の引数を受け入れることができる関数を作成することを目的としています。ただし、すべての引数が同じ型であることを確認してください。私たちは、配列やベクトルなどの追加のデータ構造に頼らずにこれを達成しようとします。

可変個引数関数

可変個引数関数自体は、引数の型安全性を提供しません。型の均一性を強制するには、可変個引数テンプレート関数の採用を検討してください。

可変個引数テンプレート関数

可変個引数テンプレート関数は次のように定義できます。

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 型の配列に変換します。次に、利用可能なメソッドを使用して、この配列を Dragon_list_t タイプに変換できます。

SFINAE との組み合わせ

このアプローチと前述の SFINAE テクニックを組み合わせると、次のようなものを作成できます。 Maiden に変換できない引数を拒否するテンプレート。

以上が可変引数関数で型の均一性を強制するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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