Boost logo

Boost :

Subject: Re: [boost] compile time parser generator
From: Ábel Sinkovics (abel_at_[hidden])
Date: 2012-01-09 01:31:36


Hi Dave,

> constexpr is somewhat crippled: although a constexpr function executes
> at compile-time, it has to obey the same rules as any other function.
> For example, its return type can depend on the type, but never on the
> *value*, of its arguments, and once you're inside the function, the
> contents of the argument are not treated as compile-time constants.
> So, I think constexpr actually doesn't promise it.
A constexpr can still be used to access the characters of a string at
compile-time. Having access to each character we can build an MPL list
of characters. Here is an example of what I'm thinking of:

----
using namespace boost::mpl;
template <int N>
constexpr char nth(const char s[N], int n)
{
   return n >= N ? 0 : s[n];
}
#define S "cool"
typedef
   push_back<
     push_back<
       push_back<
         push_back<
           push_back<
             push_back<
               string<>,
               char_<nth<sizeof(S)>(S, 0)>
 >::type,
             char_<nth<sizeof(S)>(S, 1)>
 >::type,
           char_<nth<sizeof(S)>(S, 2)>
 >::type,
         char_<nth<sizeof(S)>(S, 3)>
 >::type,
       char_<nth<sizeof(S)>(S, 4)>
 >::type,
     char_<nth<sizeof(S)>(S, 5)>
 >::type
   str;
int main()
{
   std::cout << c_str<str>::type::value << std::endl;
}
----
The code getting the characters one by one and building the MPL list (or 
string in the above example) can be generated by a macros - I know it is 
not that nice and the length of the string will be tricky, but we'll 
have something. The above code snippet compiles with gcc 4.6.
Regards,
   Ábel

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