Not sure about what do you exactly want... and surely you can't obtain what do you want in a simple way with a simple class A... but if you accept to add a level of indirection... I mean: a struct/class A<1, 2, 3, 0, 0, 0> that inherit from B<1, 2, 3>...
We need something that strip the trailing zero from an integer sequence.
Maybe there are simpler methods but I imagine a custom type traits as follows
template <typename, typename, int...>
struct szh;
// non zero element case
template <int ... As, int ... Bs, int C, int ... Ds>
struct szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs...>,
C, Ds...>
: public szh<std::integer_sequence<int, As..., Bs..., C>,
std::integer_sequence<int>,
Ds...>
{ };
// zero element case
template <int ... As, int ... Bs, int ... Ds>
struct szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs...>,
0, Ds...>
: public szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs..., 0>,
Ds...>
{ };
// ground case
template <int ... As, int ... Bs>
struct szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs...>>
{ using type = std::integer_sequence<int, As...>; };
template <int ... Is>
using strip_trailing_zeros
= typename szh<std::integer_sequence<int>,
std::integer_sequence<int>,
Is...>::type;
I've made it generic because I think it's better make complicated code reusable. But if the final type is B<As...> instead of std::integer_sequence<int, As...>, the following code can be simplified a little but strip_trailing_zeros can't be re-used.
Now a simple class B (observe that the constructor prints the Is...)
template <int ... Is>
struct B
{ B () { ((std::cout << Is), ...); std::cout << '\n'; } };
and a converter (only declared) from std::integer_sequenc<int, Is...> to B<int...>
template <int ... Is>
B<Is...> foo (std::integer_sequence<int, Is...>);
so A become
template <int ... Is>
struct A : public decltype(foo(strip_trailing_zeros<Is...>{}))
{ };
The following is a full compiling example
#include <iostream>
#include <utility>
template <typename, typename, int...>
struct szh;
template <int ... As, int ... Bs, int C, int ... Ds>
struct szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs...>,
C, Ds...>
: public szh<std::integer_sequence<int, As..., Bs..., C>,
std::integer_sequence<int>,
Ds...>
{ };
template <int ... As, int ... Bs, int ... Ds>
struct szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs...>,
0, Ds...>
: public szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs..., 0>,
Ds...>
{ };
template <int ... As, int ... Bs>
struct szh<std::integer_sequence<int, As...>,
std::integer_sequence<int, Bs...>>
{ using type = std::integer_sequence<int, As...>; };
template <int ... Is>
using strip_trailing_zeros
= typename szh<std::integer_sequence<int>,
std::integer_sequence<int>,
Is...>::type;
template <int ... Is>
struct B
{ B () { ((std::cout << Is), ...); std::cout << '\n'; } };
template <int ... Is>
B<Is...> foo (std::integer_sequence<int, Is...>);
template <int ... Is>
struct A : public decltype(foo(strip_trailing_zeros<Is...>{}))
{ };
int main()
{
A<1, 0>{}; // print "1" (inherit from B<1>)
A<1, 1>{}; // print "1, 1" (inherit from B<1, 1>)
A<1, 2, 3, 0, 0, 0>{}; // print "1, 2, 3" (inherit from B<1, 2, 3>)
A<1, 2, 3>{}; // // print "1, 2, 3" (inherit from B<1, 2, 3>)
}