ホームページ  >  記事  >  バックエンド開発  >  C++ 関数テンプレートと SFINAE の組み合わせ (型導出が有効にならない)?

C++ 関数テンプレートと SFINAE の組み合わせ (型導出が有効にならない)?

WBOY
WBOYオリジナル
2024-04-15 11:39:01895ブラウズ

関数テンプレートを SFINAE と組み合わせて使用​​すると、汎用関数を作成し、テンプレートのパラメーター タイプに基づいて関数の動作を調整できます。 SFINAE を使用すると、テンプレート パラメーターの型推定が失敗するかどうかに基づいて関数の可用性を制御できます。関数テンプレートを一緒に使用すると、整数型と非整数型の区別、ブール型の除外など、型の制約に基づいて動作を調整できるため、柔軟でタイプセーフなコードが得られます。

C++ 函数模板与 SFINAE(类型推导失败有效)的结合使用?

C 関数テンプレートと SFINAE の組み合わせ

はじめに

C 関数テンプレートを使用すると、ジェネリック関数を作成できます、さまざまなタイプに利用可能です。ただし、場合によっては、テンプレート パラメーターのタイプに基づいて関数の動作を調整する必要がある場合があります。ここで SFINAE (Type Deduction Failed Efficient) が登場します。

SFINAE

SFINAE は、テンプレート パラメーター タイプの有無に基づいて関数の利用可能性を決定できる手法です。テンプレート引数を推論できない場合、コンパイラーは導出の失敗を報告します。これを使用して関数の可用性を制御できます。

C 関数テンプレートと SFINAE の併用

SFINAE を使用することで、関数テンプレートの機能を拡張できます。例を見てみましょう:

template <typename T>
typename std::enable_if<std::is_integral<T>::value, void>::type func(T x) {
  // Integral type-specific implementation
}

template <typename T>
typename std::enable_if<!std::is_integral<T>::value, void>::type func(T x) {
  // Non-integral type-specific implementation
}

この例では、関数テンプレート func を作成し、テンプレート パラメーター T の型に基づいてさまざまな関数シグネチャを選択します。 std::enable_if を使用して、特定の型制約が満たされた場合にのみ使用できる 2 つの入れ子関数を作成します。整数型の場合は最初の関数が呼び出され、非整数型の場合は 2 番目の関数が呼び出されます。

実際的なケース

次に、SFINAE で C 関数テンプレートを使用する実際的なケースを示します:

// 实现求平方和的函数模板
template <typename T>
auto sum_of_squares(const std::vector<T>& v) {
  typename std::enable_if<!std::is_same<T, bool>::value, decltype(v[0]*v[0])>::type result = T{};

  for (const auto& elem : v)
    result += elem * elem;

  return result;
}

この場合、関数テンプレートを作成しました。 sum_of_squares、ベクトル内のすべての要素の二乗和を求めます。 SFINAE を使用すると、二乗演算をサポートしていないため、ブール型は除外されます。

結論

C 関数テンプレートと SFINAE を組み合わせて使用​​すると、柔軟でタイプセーフな汎用コードの作成に役立つ強力なツールが提供されます。テンプレート パラメーターの型を活用することで、型の制約に基づいて実行時の関数の動作を調整できます。これにより、効率的でスケーラブルなコードを作成できるようになります。

以上がC++ 関数テンプレートと SFINAE の組み合わせ (型導出が有効にならない)?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。