Douglas Gregor wrote: > > In other words, can we allow a zero-arity 'function<...>' > > to treat ordinary values as first-class function objects? > > Do we want to? I think not, because boost::function will lose > its ability to safely replace function pointers.
That's a valid concern, but on the other hand, as a user that doesn't have any plain function pointers to replace ;), I might be willing to pay that price for the benefits of the proposed semantics nevertheless - that is, if 'boost::function<>' itself is not planned to support '= 0' syntax. Judging from the other thread, it is ;), so consider my suggestion withdrawn. > > #include your friendly local lambda header and you can do this: > > boost::function<int ()> f1 = constant(-1); Yes, I realize that, but I wanted a cleaner syntax for this. > Aside from that, I'm not sure it's implementable. We would > need a way to tell if an arbitrary class type is a function > object or not. If we can do this, we will have solved the > is_callable problem and Boost.Function will become very > useful indeed :) I would say that this one ought to work: #include "boost/static_assert.hpp" typedef char (&no_tag)[1]; typedef char (&yes_tag)[2]; template < long > struct sink {}; template< typename T > no_tag is_callable_helper(...); template< typename T > yes_tag is_callable_helper( sink< sizeof(&T::operator()) >* ); template< typename T > struct is_callable { BOOST_STATIC_CONSTANT(bool , value = sizeof(is_callable_helper<T>(0)) == sizeof(yes_tag) ); }; struct her {}; struct my { int operator()(); }; BOOST_STATIC_ASSERT(!is_callable<int>::value); BOOST_STATIC_ASSERT(!is_callable<her>::value); BOOST_STATIC_ASSERT(is_callable<my>::value); But of course none of the compilers are particularly happy about it. How about adding 'is_callable<>' to the type_traits proposal and requesting a compiler support for it? Aleksey _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost