Maison > développement back-end > C++ > le corps du texte

Modèles de fonctions C++ combinés avec SFINAE (la dérivation de type échoue) ?

WBOY
Libérer: 2024-04-15 11:39:01
original
862 Les gens l'ont consulté

Modèle de fonction Utilisé en conjonction avec SFINAE pour créer des fonctions génériques et ajuster le comportement des fonctions en fonction des types de paramètres du modèle. SFINAE nous permet de contrôler la disponibilité des fonctions en fonction de l'échec ou non de la déduction du type de paramètre de modèle. Lorsqu'ils sont utilisés ensemble, les modèles de fonctions peuvent affiner le comportement en fonction des contraintes de type, telles que la distinction entre les types entiers et non entiers, l'exclusion des types booléens, etc., ce qui donne lieu à un code flexible et sécurisé.

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

Utilisation de modèles de fonctions C++ avec SFINAE

Introduction

Les modèles de fonctions C++ nous permettent de créer des fonctions génériques qui fonctionnent sur de nombreux types différents. Cependant, dans certains cas, nous souhaiterons peut-être affiner le comportement de la fonction en fonction du type de paramètres du modèle. C’est là qu’intervient le SFINAE (Type Deduction Failed Efficient).

SFINAE

SFINAE est une technique qui nous permet de décider de la disponibilité d'une fonction en fonction de la présence ou de l'absence d'un type de paramètre de modèle. Si un argument de modèle ne peut pas être déduit, le compilateur signalera un échec de dérivation, que nous pouvons utiliser pour contrôler la disponibilité des fonctions.

Utilisation combinée des modèles de fonctions C++ et de SFINAE

Nous pouvons étendre les fonctionnalités des modèles de fonctions en utilisant SFINAE. Regardons un exemple :

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
}
Copier après la connexion

Dans cet exemple, nous créons un modèle de fonction func et sélectionnons différentes signatures de fonction en fonction du type du paramètre de modèle T. En utilisant std::enable_if, nous créons deux fonctions imbriquées qui ne sont disponibles que lorsque certaines contraintes de type sont remplies. Pour les types entiers, la première fonction sera appelée, et pour les types non entiers, la deuxième fonction sera appelée. func,根据模板参数 T 的类型选择不同的函数签名。使用 std::enable_if,我们创建两个嵌套函数,它们仅在满足特定类型约束时可用。对于整数类型,将调用第一个函数,对于非整数类型,将调用第二个函数。

实战案例

以下是一个 C++ 函数模板与 SFINAE 结合使用的实际案例:

// 实现求平方和的函数模板
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;
}
Copier après la connexion

在这个案例中,我们创建了一个函数模板 sum_of_squares

Cas pratique

Ce qui suit est un cas pratique d'utilisation de modèles de fonctions C++ avec SFINAE :

rrreee

Dans ce cas, nous avons créé un modèle de fonction sum_of_squares qui résoudra le vecteur La somme de les carrés de tous les éléments. En utilisant SFINAE, nous excluons le type booléen car il ne prend pas en charge les opérations carrées. 🎜🎜🎜Conclusion🎜🎜🎜Les modèles de fonctions C++ combinés à SFINAE fournissent un outil puissant qui peut nous aider à créer du code générique flexible et sécurisé. En tirant parti des types de paramètres de modèle, nous pouvons affiner le comportement des fonctions au moment de l'exécution en fonction des contraintes de type. Cela nous permet d’écrire du code efficace et évolutif. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!