#ifndef TEMPL_LITERAL_H #define TEMPL_LITERAL_H #include #include #ifndef TEMPLATE_LITERAL_MAX_SYM #define TEMPLATE_LITERAL_MAX_SYM 20 #endif template< char... > struct TemplateLiteral { }; template< std::size_t LEN, char CHAR, char... CHARS > struct TemplateLiteralTrim { private: template< bool, class, char... > struct Helper; template< char... C1, char... C2 > struct Helper< false, TemplateLiteral, C2... > { static_assert(sizeof...(C1) == LEN, "Literal is too large. Extend it with #define TEMPLATE_LITERAL_MAX_SYM"); typedef TemplateLiteral Result; }; template< char... C1, char c1, char c2, char... C2 > struct Helper< true, TemplateLiteral, c1, c2, C2... > { typedef typename Helper< (bool)c2, TemplateLiteral, c2, C2...>::Result Result; }; public: typedef typename Helper<(bool)CHAR, TemplateLiteral<>, CHAR, CHARS..., '\0' >::Result Result; }; template< class T, std::size_t N > constexpr inline std::size_t sizeof_literal( const T (&)[N] ) { return N; } template< std::size_t M > constexpr inline char getNthCharSpec( std::size_t N, const char (&literal)[M] ) { return N < M ? literal[N] : '\0'; } #define GET_Nth_CHAR_FOR_PP(I, N, LIT) ,getNthCharSpec(N, LIT) #define TEMPLATE_LITERAL_BASE(MAX, LIT) \ (typename TemplateLiteralTrim< sizeof_literal(LIT) - 1 \ BOOST_PP_REPEAT(MAX, GET_Nth_CHAR_FOR_PP, LIT) >::Result()) #define TEMPLATE_LITERAL(LITERAL) TEMPLATE_LITERAL_BASE(TEMPLATE_LITERAL_MAX_SYM, LITERAL) #endif //TEMPL_LITERAL_H