====Déclaration des variables==== ===Pointeur sur méthode vs std::function=== ''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''. #include int main() { auto funcPtr = +[] {}; static_assert(std::is_same::value); void (*funcPtr2)() = [] {}; static_assert(std::is_same::value); // funcPtr3 est un std::function. auto funcPtr3 = [] {}; // error: static assertion failed static_assert(std::is_same::value); } [[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. struct S5 { template void f(U&&...) const { std::cout << "S5" << sizeof...(T) << "-" << sizeof...(U) << "\n"; } }; auto ptr = static_cast(&S5::f) [[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=== struct Z { int z; }; struct A { Z* i; }; struct B { 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; } ===Variable optionnelle=== Création une variable ''field'' de type ''void*'' si ''T'' est de type ''int''. std::conditional_t, int, void*> field; ====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}} Bien noter que la lambda est exécutée tout de suite avec un ''()'' juste après sa déclaration.