dimanche 4 septembre 2016

Nested namespace definition

Entrée remarquée dans c++17 de la fonctionnalité de définition des espaces de noms imbriqués. C'est à dire qu'au lien de mettre des séries de "namespace a { namespace b { namespace c { ...", l'on peut directement écrire "namespace a::b::c { ...". Ça ne va pas changer la vie de qui que ce soit, mais pourquoi pas. Comme d'hab, le petit programme d'exemple:

#include <iostream>

namespace a::b::c // magie!!!!
{
  void f()
  {
    std::cout << "Ouh là, c'est profond!" << std::endl;
  }
}

int main()
{
  a::b::c::f();
  
  return 0;
}

vendredi 2 septembre 2016

Folding expressions

Youpie, gcc 6.1 a débarqué dans Debian! C'est une excellente occasion pour se plonger dans les nouveautés du standard. Parlons donc d'une fonctionnalité que j'avais complètement zappé, les "folding expression". L'idée est de fournir du sucre syntaxique pour permettre d'appliquer certains opérateurs à l'ensemble des paramètres variadiques d'une fonction. Dit comme ça, cela semble assez abstrait, mais puisque comme disait Napoléon, un petit bout de code vaut mieux que de grands discours, voici un exemple.

L'idée est donc d'écrire une fonction qui peut prendre un nombre quelconque d'arguments, et en retourner la somme. Avec une "folding expression", rien de plus simple! La syntaxe est un peu absconse, "(... [operator] args)" (ne pas oublier les parenthèses!), mais ça fait le boulot.

#include <iostream>

template<typename ...ARGS>
int variadicAdd(ARGS... args)
{
  return (... + args);
}

int main()
{
  std::cout << variadicAdd(3, 2, 7, 8, 4, 5) << std::endl;
  return 0;
}

Comme vous voyez, c'est tout bête. L'on aurait pu coder la même fonctionnalité avec des appels récursifs, mais c'est quand même beaucoup plus succinct comme ça. L'on peut "replier" les expressions avec tout un tas d'opérateurs, et j'attends avec impatience de voir ce que l'on va inventer avec cette construction.