Oh, ok I see what you mean.
So the problem with the C++ metaprogramming is that you can only pass these kind of things as template argument:
- Type Parameters.
- Types
- Templates (only classes, no functions)
- Non-type Parameters
- Pointers
- References
- Integral constant expressions
So you have to be able to communicate using only that very limited information that's why some of the templates looks like a spaghetti with many ingredients. You have to use sometimes the ::value or ::type field ( it became some sort of standard ) in order to pass something that cam mimic a value and brings an information that you can use in further evaluation of the template so you can use different tricks and techniques to do it but at the end they will look like a lot of different addons rather than clean and readable implementation. That's why some people invented type_traits which suppose to help simplify some type's operations like the is_base_of - which allows you to check if class A is derived from B but you have to check the ::value again if you want to use as if in some template.
PS. One of the type_trait ability is to check if the type is integral or not is_integral so you can use that if you need to check if pure bool has been used or not. You can also pass this information as test for a bool type within the template argument.