
Hicham Mouline wrote:
Hi Eric,
Thank you for the LHS grammar. I have made the changes you suggested in the attached files.
The main header
(I'll change this name later) includes constants (c0 ... c100), variables(x0... x100 and x y z S r q v t), basic functions from <cmath> and general functions defined by the user, with dimensions 0 to 100. Question1: With PP, I define constants c0 to c100, as non-const because I let the user initialize them to a integer variables or literals or floating point variables or literals.
I don't understand, but it probably doesn't matter.
Does the non-constness matter? They are defined in a header file included by users of the library.
You'll have linker trouble if two translation units include that header. You should define them in a .cpp file and mark them as extern in the header.
Question2: With PP, I also define variables. I had variable_tag as a template taking <unsigned int subscript>. Not subscript has nothing to do with the dimensionality here. These are just different 1d variables. But then to match the proto:_ in the grammar, I high jacked your idea of a numerical MPL metafunction mpl::size_t<> for variables as well. Also, note the non-constness?? What do you think of the stand alone x y z S .... non subscripted variables?
I'm not sure what you're asking here.
Queestion3: I made dimension_of a numerical metafunction with an embedded value member.
OK, that's reasonable.
What is the convenience of making metafunctions numerical?
I don't know what you're asking.
Should dimension_of be specialized for function_tag<> templates rather than on any type, as: template
struct dimension_of< function_tag< mpl::size_t<dim> > > { ... }; Any advantage to this?
No real advantage, but a couple of disadvantages. You'll find that with
this formulation, dimension_of< const function_tag
Question4: What is a quick way to test fundef_lhs_grammar does what I intend?
When I want to test a grammar, I define two functions like this:
template<typename E>
void assert_matches( E const & )
{
BOOST_MPL_ASSERT((proto::matches