#define max(a, b) \ ({ __typeof__(a) _a = (a), \ __typeof__(b) _b = (b), \ (_a >= _b)? _a : _b })
This definition of max(a, b) prevents evaluating the expressions a and b more than once. These expressions can cause side-effects, such as printing a message to the screen.
The typeof operator apparently also works for C++. It is sometimes awkward to write out the type of the whole expression. For example,
void foo() { std::vector<int> v; for (std::vector<int>::const_iterator iter = v.begin(); iter != v.end(); iter++) { /* ... */ } }
Writing the type for the iterator is cumbersome. In C++0x, this code can be written like this using the auto keyword.
void foo() { std::vector<int> v; for (auto iter = v.begin(); iter != v.end(); iter++) { /* ... */ } }
In C++, using the __typeof__ keyword, we can write a macro like this:
#define autovar(x, exp) __typeof__(exp) x = (exp)
And the code above would look like this:
void foo() { std::vector<int> v; for (autovar(iter, v.begin()); iter != v.end(); iter++) { /* ... */ } }
Here is another use of the typeof operator: sometimes C++ can't figure out how to instantiate a template, and manually writing the type arguments can be tedious. You can use __typeof__ to help the compiler figure out the correct template parameter.
Apparently Boost provides a BOOST_AUTO macro that uses pretty much the same technique.
In C++0x, the typeof keyword is called decltype.
No comments:
Post a Comment