Основная идея:
template<std::size_t size_of_t2, class T>
struct Base
{
void f1(params1);
};
template<class T>
struct Base<0, T>
{
void f2(params2);
};
template<class T, std::size_t... T2>
struct S : Base<sizeof...(T2), T>
{ };
В качестве альтернативы, вы можете иметь f1
и f2
, присутствующие в S
, а затем защитить их использование с помощью static_assert
(обратите внимание, что функции-члены классашаблон не создается, если он не используется):
template<class T, std::size_t... T2>
struct S
{
void f1(params1)
{
static_assert(sizeof...(T2) > 0);
...
}
void f2(params2)
{
static_assert(sizeof...(T2) == 0);
...
}
};