Я не знаю, если это то, что вы имеете в виду. Вот как вы можете выбрать другую реализацию, если второй аргумент шаблона соответствует размеру первого аргумента шаблона - 1.
template<typename L, size_t offset>
class aImplMatch
{ // choose this if offset == sizeof(L) - 1
L v;
};
template<typename L, size_t offset>
class aImpl
{
L v;
char off[offset];
};
template<typename L, size_t offset, size_t i>
struct SelectImpl{};
template<typename L, size_t offset>
struct SelectImpl<L, offset, 0> { typedef aImplMatch<L, offset> Result; };
template<typename L, size_t offset>
struct SelectImpl<L, offset, 1> { typedef aImpl<L, offset> Result; };
template<typename L, size_t offset>
class a
{
enum {I = offset == sizeof(offset) - 1 ? 0 : 1 };
typedef typename SelectImpl<L, offset, I>::Result Impl;
Impl impl;
};
Может быть, это можно сделать лучше / проще, это была моя первая мысль ...