You are on page 1of 2

1. While the ternary operator (?:) is well known, many dont realise that it can also be used as lvalues.

x = (y < 0) ? 10 : 20; (a == 0 ? a : b) = 1; Otherwise, you would be writing this as, if (a == 0) a = 1; else b = 1; 2. The namespace alias is pretty easy to miss. Once you know about it though, you will start recognising it everywhere. It is especially useful when yourr writing a large code with a lot of namespace hierarchies. namespace x = boost::filesystem; x::path myPath(strPath, fs::native ); 3. Variables arent the only ones that can be declared in the init part of functions. You can also declare classes and other functions. for(struct { int x; float y; } loop = { 1, 2 }; ...; ...) { ... } 4. The unary + operator can be used in order to promote or decay a number of things. See below for some examples. +EnumeratorValue: This gives your enumerator value a perfect integer type, which lets it fit its value. This is quite useful for implementing overloaded operators for enumeration. Passing a temporary value to a variable: You can create a temporary value for a variable using this operator. For example, if you have a class that uses an in class static initializer without any out of class definition, but sometimes the system fails to link. struct Foo { static int const value = 42; }; template void f(T const&);

int main() { // fails to link and tries to get the address of "Foo::value"! f(Foo::value); // works - pass a temporary value f(+Foo::value); } Decay an array to a pointer: The operator also works when you want to pass two values to a function. template void f(T const& a, T const& b); int main() { int a[2]; int b[3]; f(a, b); // won't work! different values for "T"! f(+a, +b); // works! T is "int*" both time } 5. You must know the id/identity metafunction. Now check out this usecase for it, which is for non-template cases. // void (*f)(); // same id::type *f; // void (*f(void(*p)()))(int); // same id::type *f(id::type *p); // int (*p)[2] = new int[10][2]; // same id::type *p = new int[10][2]; // void (C::*p)(int) = 0; // same id::type C::*p = 0; It helps decrypting C++ declarations greatly! // boost::identity is pretty much the same template struct id { typedef T type; };

You might also like