Weekly Snap: Puppet Camp Hits Germany, PrestaShop & C++11 latest

3 – 7 September counted down to Germany’s first Puppet Camp and OSMC 2012, introduced “The Checker”, C++11 and Galaxy S3 features as well as the system behind our new hardware shop.
Eva counted 44 days down to the OSMC 2012 with Werner Fischer’s presentation on “Hardware Monitoring with the New IPMI Plugin V2” and 45 days to the first Puppet Camp in Germany.
Thilo then took us through more features in Samsung Galaxy S3 as part 2 of his mobile office series, while Philipp introduced our plugin to check plugins, known as the check_executor.
Georg revealed the software behind our new-look, online hardware store (thanks PrestaShop), and Gunnar looked at C++11’s most important new features.

Neuerungen in C++11

C++ ist eine der beliebtesten Programmiersprachen und wird vor allem für komplexe Software-Projekte verwendet, wenn Performance wichtig ist.
Um die Sprache einfacher verständlich und einsatzfähig zu machen, wurde 2011 vom zuständigen ISO-Gremium die neue Version C++11 veröffentlicht, an der bereits seit 2005 gearbeitet wurde.
Eine der meiner Meinung nach wichtigsten Änderungen ist dabei die Unterstützung von Type Inference. Dieses Feature ermöglicht es, Variablen zu deklarieren, ohne ihren genauen Typ angeben zu müssen. Der Compiler erkennt hierbei anhand von dem Initialisierungs-Ausdruck, welchen Typ eine Variabel hat. Dies macht z.B. die Verwendung von STL-Containern einfacher:
Mit C++98:
map::iterator it = m.begin();
Mit C++11:
auto it = m.begin();
Zusammen mit den neuen Range-based For-Loops wird dieses Feature noch mächtiger:
Vorher:

vector::iterator it;
for (it = v.begin(); it != v.end(); it++) {
  ...
}

Nachher:

for (auto i : v)
  ...
}

Die C++-Standard-Library bietet für viele Algorithmen eine Implementation an, z.B. zum Filtern oder Durchsuchen von Listen. Hierfür musste jedoch bisher eine Funktion als Callback übergeben werden, z.B.:

bool compare_numbers(int a, int b)
{
  if (a % 2 == 0 && b % 2 == 0)
    return a < b;
  else
  return (a % 2 == 0);
}
int main(int argc, char **argv)
{
  vector numbers = { 4, 3, 2, 7 };
  sort(numbers.begin(), numbers.end(), compare_numbers);
  for (int i : numbers)
    cout << i << endl;
  return 0;
}

C++11 bringt Unterstützung für Lambda-Ausdrücke, wie sie bereits aus anderen Sprachen wie z.B. Python bekannt sind:

int main(int argc, char **argv)
{
  vector numbers = { 4, 3, 2, 7 };
  sort(numbers.begin(), numbers.end(), [](int a, int b) {
    if (a % 2 == 0 && b % 2 == 0)
      return a < b;
    else
      return (a % 2 == 0);
  });
  for (int i : numbers)
    cout << i << endl;
  return 0;
}

Dies sind nur einige wenige Neuerungen, die den Programmierer-Alltag einfacher machen sollen. Das GNU-Projekt hat eine Liste aller Änderungen in C++11 und deren Implementations-Status in GCC: http://gcc.gnu.org/projects/cxx0x.html
Ein Problem von C++11 ist, dass die meisten Compiler noch nicht alle Features des neuen Standards unterstützen und man gerade bei Open Source-Projekten darauf achten muss, dass auch ältere Compiler-Versionen unterstützt werden. Vermutlich wird es daher noch einige Jahre dauern, bis C++11 allgemeintauglich ist.