Well, now somehow, I think I need a better solution for this random access
thing. Looks like I am actually polluting the global namespace in this
pursuit. Also macros can break easily on extension.
Best wishes
Ganesh Prasad
On 26 February 2015 at 17:55, Ganesh Prasad
On 02/25/2015 11:02 AM, pfultz2 wrote:
There is no such thing as random access in TMP.
But we can surely imitate a Random Access Container in TMP. Just this morning it came to my mind that we can make a Compile time random access container using templates and preprocessor macros. Here is the code, pretty roughly and quickly written.
1 #define STATIC_ASSERT(expr) { char assertion_stage[((expr) ? 0:-1)]; } 2
3 #define RANDOM_ACCESS_CONTAINER_META(KEY_TYPE, val_type, name) \
4 template
\ 5 struct meta_container_##name##_{ \
6 typedef val_type value_type; \
7 typedef KEY_TYPE key_type; \
8 static const value_type value = static_cast
(0); \ 9 }; \
10 typedef KEY_TYPE meta_container_##name##_key_type_; \
11 typedef val_type meta_container_##name##_val_type_;
12
13 #define RANDOM_ACCESS_INSERT(name, key, val) \
14 template<> struct meta_container_##name##_<key>{ \
15 typedef meta_container_##name##_val_type_ value_type; \
16 typedef meta_container_##name##_key_type_ key_type; \
17 static const value_type value = val; \
18 };
19
20 #define RANDOM_ACCESS_GET(name, key) meta_container_##name##_<key>::value 21
22 RANDOM_ACCESS_CONTAINER_META(int, int, TMP_INT_MAP);
23
24 RANDOM_ACCESS_INSERT(TMP_INT_MAP, 5, 15);
25 RANDOM_ACCESS_INSERT(TMP_INT_MAP, 6, 18);
26 RANDOM_ACCESS_INSERT(TMP_INT_MAP, 7, 21);
27
28
29 int main(){
30
31 STATIC_ASSERT ( RANDOM_ACCESS_GET(TMP_INT_MAP, 5) == 15 );
32 STATIC_ASSERT ( RANDOM_ACCESS_GET(TMP_INT_MAP, 6) == 18 );
33 STATIC_ASSERT ( RANDOM_ACCESS_GET(TMP_INT_MAP, 7) == 21 );
34 STATIC_ASSERT ( RANDOM_ACCESS_GET(TMP_INT_MAP, 1) == 0 );
35
36 return 0;
37 }
I might be wrong and this might not be the general case, but it's definitely possible to imitate. After all TMP is turing complete, hence, random access containers should not be non-existent.
Best wishes Ganesh Prasad
On 26 February 2015 at 05:20, Larry Evans
wrote: On 02/25/2015 11:02 AM, pfultz2 wrote:
IMO the fact it mimics the standard library is very positive, for it makes transition much easier for someone used to the STL first experimenting with metaprogramming.
Actually, that is what has helped me when I started using MPL. However, iterator-based approach for metaprogramming has a huge impact on performance. There is no such thing as random access in TMP.
Not now, but maybe in the future:
http://atpp.irrequietus.eu/atpp-c79f4b7.pdf
-regards, Larry
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost