Boost logo

Boost :

Subject: [boost] [Review] Boost.Type Traits Extension by Frederic Bron
From: Joachim Faulhaber (afojgo_at_[hidden])
Date: 2011-03-18 06:29:09


2011/3/18 Frédéric Bron <frederic.bron_at_[hidden]>:
>> I've found some problems. In the ICL I have an
>> operator +
>>
>> template <class Type>
>> inline typename enable_if
>> <is_associative_element_container<Type>, Type>::type
>> operator + (Type object, const Type& operand);
>>
>> and is seems that more overloads are checked valid as actually exist.
>> Is this intentional?
>>
>> BOOST_AUTO_TEST_CASE(has_op_extension_qualifiers)
>> {
>> typedef int T;
>> typedef interval_set<T>             IntervalSetT;
>> typedef IntervalSetT::interval_type IntervalT;
>>
>> // This is supposed to succeed
>> BOOST_CHECK((has_operator_plus<IntervalSetT, const IntervalSetT&,
>> IntervalSetT>::value));
>>
>> BOOST_CHECK((!is_convertible<const IntervalSetT&, IntervalSetT&>::value));
>>
>> // These are supposed to fail, but they succeed
>> BOOST_CHECK((has_operator_plus<IntervalSetT, IntervalSetT&,
>> IntervalSetT>::value));
>> BOOST_CHECK((has_operator_plus<IntervalSetT, IntervalSetT,
>> IntervalSetT>::value));
>> BOOST_CHECK((has_operator_plus<IntervalSetT, IntervalSetT,
>> IntervalSetT const&>::value));
>> }
>
> Your question here is the same as the following example:
>
> struct T { };
> struct RET { };
>
> RET f(T, const T&) { return RET(); }
> void g(RET) { }
> void h(const RET&) { }
>
> int main() {
>        //Does this work?
>        { T t1; const T &t2=t1; g(f(t1, t2)); } // -> yes
>        { T t1; T &t2=t1; g(f(t1, t2)); } // -> yes
>        { T t1; T t2; g(f(t1, t2)); } // -> yes
>        { T t1; T t2; h(f(t1, t2)); } // -> yes
>        return 0;
> }
>
> What it means it that has_operator_plus<LHS, RHS, RET> does not check
> for exact conformance of arguments LHS and RHS but checks if you can
> use LHS and RHS as arguments to the operator.

understood.

Doesn't this mean, that the naming

has_operator_xxx

is imprecise and should be

operator_xxx_applicable_to

or

operator_xxx_callable_on

instead?

Joachim

-- 
Interval Container Library [Boost.Icl]
http://www.joachim-faulhaber.de

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk