My first suggestion will be "change your approach!"
If you have truly different custom implementations for all 12 possibilities, you don't really have a template, do you? Templates are cases where the code is mostly all the same, but some specific details like the payload type are different. If your code is all different, why bother?
Maybe you should look at polymorphism and virtual methods, and just implement
and friends.
That said, to answer your specific question, you can write value-specialized templates by eliminating the specialized variables from your template declaration and adding the specialization to the class name:
Code:
template<bool> struct StaticAssertStruct;
template<> struct StaticAssertStruct<true> {};
Note that this is true
everywhere! You have to spell the class name as ClassName<specialization> all over the place. It's an incredible pain, which is why I recommend you don't do this.