according to this point in the library documentation:
http://www.boost.org/doc/libs/1_39_0/doc/html/thread/synchronization.html#th...
there are, among others, these non-member functions on Boost.Thread:
template<typename ForwardIterator>
void lock(ForwardIterator begin,ForwardIterator end);
template
void lock(Lockable1& l1,Lockable2& l2);
this example:
vector<mutex> vec;
lock(vec.begin(),vec.end());
fails on gcc 4.3.2, complaining that the vector iterator doesn`t have
members named, lock(), unlock(), ...
after looking at the source I`m not even sure how this is supposed to work.
the implementation seems to try to differentiate between Lockable and
ForwardIterator with this and other templates like it:
template<typename T>
struct has_member_lock{
typedef char true_type;
struct false_type{
true_type dummy[2];
};
template<typename U>
static true_type has_member(U*,void (U::*dummy)()=&U::lock);
static false_type has_member(void*);
BOOST_STATIC_CONSTANT(bool,
value=sizeof(has_member_lock<T>::has_member((T*)NULL))==sizeof(true_type));
};
it looks like it tries to exploit SFINAE but it does so with a default
argument that is not always resolvable.
an old discussion on the boost mailing list about a has_member type
trait seems to confirm that there is no portable way to do that and at
the time only vc++ accepted that kind of code.
but the only requirement placed on including this code is:
#if defined(BOOST_NO_SFINAE) || \
BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) || \
BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
am I missing something?