Outils pour utilisateurs

Outils du site


lang:cpp:variable

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:variable [2020/03/05 22:37] – Déplacement de "Pointer vers une classe template depuis une classe sans template" rootlang:cpp:variable [2025/07/28 10:36] (Version actuelle) – Précision sur l'utilisation de la lambda dans "Initialisation complexe d'une constante" root
Ligne 1: Ligne 1:
-===Initialisation complexe d'une variable constante===+====Déclaration des variables==== 
 +===Pointeur sur méthode vs std::function===
  
-Plutôt que+''std::function'' supporte les lambda avec des captures, la syntaxe C ne supporte que la capture du ''this''
 + 
 +De même, il faut préfixer par un ''+'' une lambda pour la forcer à être interprété comme un pointeur avec la syntaxe C. Nécessite uniquement si la déclaration de la variable pointeur sur fonction est de type ''auto''.
  
 <code cpp> <code cpp>
-std::string str; +#include <type_traits> 
-if (i == 1+ 
-  str "un"+int main() { 
-else if (i == 2+  auto funcPtr = +[] {}; 
-  str "deux"+  static_assert(std::is_same<decltype(funcPtr), void (*)()>::value); 
-else +  void (*funcPtr2)() [] {}
-  str = "trois";+  static_assert(std::is_same<decltype(funcPtr2), void (*)()>::value); 
 +  // funcPtr3 est un std::function. 
 +  auto funcPtr3 [] {}
 +  // error: static assertion failed 
 +  static_assert(std::is_same<decltype(funcPtr3), void (*)()>::value); 
 +}
 </code> </code>
  
-écrire+[[https://www.cppstories.com/2020/08/c-lambda-week-some-tricks.html/#heading|+[]()]] {{ :lang:cpp:variable:lambda_week_tricks_-_c_stories_7_28_2025_10_28_36_am_.html |Archive du 07/08/2020 le 28/07/2025}} 
 + 
 +===Pointeur sur la méthode d'une classe=== 
 + 
 +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/pointer_function.cpp}} 
 + 
 +Exemple avec une fonction utilisant des template avec auto déduction. Dans ce cas, il faudra faire un cast pour donner le type des éléments déduits.
  
 <code cpp> <code cpp>
-const std::string str = [&i]() +struct S5 
-+  template <typename... T, typename... U> 
-  if (i == 1+  void f(U&&...const { 
-    return "un"+    std::cout << "S5<< sizeof...(T<< "-" << sizeof...(U) << "\n"; 
-  else if (i == 2) +  } 
-    return "deux"; +}
-  else + 
-    return "trois"+auto ptr = static_cast<void (S5::*)(int&&, char&&) const>(&S5::f<int, double, char>)
-}(); // Ne pas oublier les parenthèses pour l'exécution de l'opérateur ().+
 </code> </code>
  
-===Pointeur sur la méthode d'une classe===+[[https://stackoverflow.com/questions/17874489/disambiguate-overloaded-member-function-pointer-being-passed-as-template-paramet|Disambiguate overloaded member function pointer being passed as template parameter]] {{ :lang:cpp:variable:c_-_disambiguate_overloaded_member_function_pointer_being_passed_as_template_parameter_-_stack_overflow_2021-05-29_08_00_38_.html |Archive du 26/07/2013 le 29/05/2021}} 
 + 
 +===Pointeur de pointeur=== 
 <code cpp> <code cpp>
-// La classe +struct Z 
-class Classe +  int z;
-{ +
-public: +
-  // Pas ici. +
-  const Classe* function(size_t i) const +
-  { return this; } +
-  // Ici. +
-  const Classe* function2(size_t i) const +
-  { return this}+
 }; };
  
-int main() +struct A { 
-+  Z* i; 
-  // Le pointeur de nom ptr. +}; 
-  const Classe* (Classe::*ptr)(size_t i) const = &Classe::function2+ 
-  Classe c+struct B { 
-  (c.*ptr)(2);+  A a; 
 +}; 
 + 
 +int main() { 
 +  auto ptr1 = &B::a; 
 +  auto ptr2 = &A::i; 
 + 
 +  B b; 
 + 
 +  // Bien mettre les parenthèses 
 +  int z = (b.*ptr1.*ptr2)->z;
 } }
 </code> </code>
 +
 +===Variable optionnelle===
 +
 +Création une variable ''field'' de type ''void*'' si ''T'' est de type ''int''.
 +
 +<code cpp>
 +std::conditional_t<std::is_integral_v<T>, int, void*> field;
 +</code>
 +
 +====Programmation fonctionnelle====
 +
 +===Initialisation complexe d'une constante===
 +
 +Plutôt que
 +
 +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/const_variable_bad.cpp}}
 +
 +écrire
 +
 +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/const_variable_good.cpp}}
 +
 +<WRAP center round info 60%>
 +Bien noter que la lambda est exécutée tout de suite avec un ''()'' juste après sa déclaration.
 +</WRAP>
 +
lang/cpp/variable.1583444270.txt.gz · Dernière modification : de root