|
Boost : |
From: Andy Little (andy_at_[hidden])
Date: 2006-10-20 07:54:14
Hi Doulas,
I sent this privately but have a feeling it may have got sopammed out. If you
got it, apologies for abusing the boost list.
Hi Douglas,
Here is a sample test, but IMO the concept in main should fail, else it is not
possible to replace a traits class, hence I have had to use one in the
following:
regards
Andy Little
//-----------------------------//line1
//defines result types for binary ops and for static types with no runtime
functions
#include <quan/meta/binary_operation.hpp>
namespace quan {namespace meta{
// is a type mpl::void_?
// (binary_operation returns mpl::void for invalid ops, hence the need to
query )
namespace detail{
auto concept NotMplVoid<typename T> {
typename type = T;
};
concept_map NotMplVoid<boost::mpl::void_> {
typedef void type;
};
}
auto concept IsNotMplVoid< typename T> {
where std::SameType<detail::NotMplVoid<T>::type,T>;
};
auto concept OperatorPlus<typename T1, typename T2>{
typename type = binary_operation<T1, plus, T2>::type;
where IsNotMplVoid<type>;
};
// should I need to do this ?... see below
template <typename T1, typename T2>
where OperatorPlus<T1,T2>
struct operator_plus{
typedef OperatorPlus<T1,T2>::type type;
};
}}
#include <quan/meta/rational.hpp>
int main()
{
using quan::meta::rational;
// succeeds but shouldnt AFAICS
// as this is invalid op and type is mpl::void_ here
typedef quan::meta::OperatorPlus<rational<1>,int >::type res; // line 45
// fails as expected but why does the Concept version above succeed?
typedef quan::meta::operator_plus<rational<1>,int >::type res; // line 49
}
ConceptGCC output:
concept_test.cpp: In function 'int main()':
concept_test.cpp:49: error: template arguments for 'struct
quan::meta::operator_plus<quan::meta::rational<1, 1>, int>' do not meet the
requirements of the primary template
concept_test.cpp:49: note: no concept map for requirement
'quan::meta::OperatorPlus<quan::meta::rational<1, 1>, int>'
concept_test.cpp:49: error: 'type' in class
'quan::meta::operator_plus<quan::meta::rational<1, 1>, int>' does not name a
type
ConceptGCC --version:
conceptg++ (GCC) 4.1.1 (Indiana University ConceptGCC alpha 3)
Copyright (C) 2006 Free Software Foundation, Inc.
Copyright (C) 2005, 2006 Trustees of Indiana University.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
regards
Andy Little
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk