|
Boost : |
Subject: [boost] [parameter] type predicates vs. concepts
From: Lorenzo Caminiti (lorcaminiti_at_[hidden])
Date: 2011-12-04 13:23:17
Hello all,
What's the difference between using a Boost.Parameter type predicate
and using a concept?
I think parameter type predicates are unary metafunctions used to
resolve the function call, concepts are asserted on the type after the
call has been resolved... Is there more? Can I always do with type
predicates what I can do with concepts? Is there ever a reason to
use/need both?
For example here has_equal_to is the type predicate while
DefautlConstructible is the concept. Could/should I have used
has_[...]_default_constructor in and_ the type predicate instead of
the DefaultConstructible concept?
#include <boost/parameter.hpp>
#include <boost/concept/requires.hpp>
#include <boost/concept_check.hpp>
#include <boost/type_traits/has_equal_to.hpp>
#include <iostream>
template< typename X >
BOOST_CONCEPT_REQUIRES( ((boost::DefaultConstructible<X>)), (bool) )
is_default_impl ( X const& x )
{
return x == X();
}
BOOST_PARAMETER_NAME(x)
BOOST_PARAMETER_FUNCTION(
(bool),
is_default,
tag,
(required (x, *(boost::has_equal_to<tag::x::_>)) )
) {
return is_default_impl(x);
}
struct no_equal {};
struct no_default { no_default(int) {} };
bool operator== ( no_default const&, no_default const& ) { return true; }
int main ( void )
{
std::cout << is_default(123) << std::endl; // ok
// parameter error: cannot resolve is_default() call
// std::cout << is_default(no_equal()) << std::endl;
// concept error: no default constructor
// std::cout << is_default(no_default(1)) << std::endl;
return 0;
}
Thanks a lot.
--Lorenzo
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk