
On Wed, Apr 13, 2011 at 5:14 PM, Daniel Frey <d.frey@gmx.de> wrote:
On 11.04.2011, at 20:15, Matt Calabrese wrote:
However, in C++0x, there is a new way to use enable_if by altering neither the function parameter list nor the specification of the return type. It can be used with operators, constructors, variadic function templates, and even overloaded conversion operations (the latter of which was previously considered impossible). The way to do it is with C++0x default function template parameters.
That's really nice, but I think the syntax might be improved. How about adding a ::value to enable_if (and the other templates) to allow your example to look like this:
template< class... T, bool = boost::enable_if_c< sizeof...( T ) == 10 >::value > test( T&&... );
template< class T, bool = boost::enable_if< boost::is_arithmetic< T > >::value > operator T() const;
etc.? Get rid of typename, *&, boost::enabler and if you like, you can write 'bool Enabled = ...' instead of 'bool = ...' to be more verbose in your code. Of course, ::value is non-existent if the condition of enable_if is not met, it is not false. I made a quick test with gcc 4.6.0 and it seems to work fine. Plus it allows extending the existing enable_if without breaking anything (AFAICS).
It does not allow you to overload like this. template < typename T, bool = boost::enable_if_c< std::is_pointer<T>::value >::value > void f( T ) { } template < typename T, bool = boost::enable_if_c< std::is_arithmetic<T>::value >::value > void f( T ) { } I think ::type * = nullptr-or-0 is enough for this.(works on C++0x, don't work on C++03) Once compilers implemented true C++0x which allows null pointer constant as a non-type template argument. Until then, enabler is a workaround that works. But default template-argument for function template is a C++0x feature too. boost::enabler is not necessary for preventing mistakes. I think users rarely use explicit template argument specification. -- Ryou Ezoe