How to create many classes to act as an implementer for an interface class, while avoiding the expense of a v-table and still allowing static casting to the interface?
For a simple case, this can be achieved, as in the example below.
Example
Library Code : -
class I{
public: virtual void i1()=0;
};
template<class Derived>class Router : public I{
public: virtual void i1()final{
static_cast<Derived*>(this)->u1();
}
};
User Code : -
class User : public Router<User>{
public: void u1(){ std::cout<<"hi"<<std::endl; }
};
int main() {
User u;
u.i1();
I* i=&u;
i->i1();
}

Full demo
Question
How to expand the function described above to support 2 routes or more?

The code below is incompatible, but it depicts my dream. ( full demonstration ).
Library Code : -
class I{
public: virtual void i1()=0;
public: virtual void i2()=0;
};
template<class Derived>class RouterI1U1 : public I{
public: virtual void i1()final{ static_cast<Derived*>(this)->u1(); }
};
template<class Derived>class RouterI1U2 : public I{
public: virtual void i1()final{ static_cast<Derived*>(this)->u2(); }
};
template<class Derived>class RouterI2U1 : public I{
public: virtual void i2()final{ static_cast<Derived*>(this)->u1(); }
};
template<class Derived>class RouterI2U2 : public I{
public: virtual void i2()final{ static_cast<Derived*>(this)->u2(); }
};
User Code : -
, , "", .
RouterI1U2<User> RouterI2U1<User>RouterI1U1<User> RouterI2U2<User>- {
RouterI1U1<User> RouterI1U2<User>} i2() - {
RouterI2U2<User> RouterI2U1<User>} i1() i1() i2()
.
class User : public RouterI1U2<User>,public RouterI2U1<User>{
public: void u1(){ std::cout<<"hi1"<<std::endl; }
public: void u2(){ std::cout<<"hi2"<<std::endl; }
};
int main() {
User u;
u.i1();
I* i=&u;
i->i1();
}
class I{
public: virtual void i1()=0;
public: virtual void i2()=0;
};
template<class Derived> class RouterI1U2_I2U1 : public I{
public: virtual void i1()final{ static_cast<Derived*>(this)->u2(); }
public: virtual void i2()final{ static_cast<Derived*>(this)->u1(); }
};
class User : public RouterI1U2_I2U1<User>{
public: void u1(){ std::cout<<"hi1"<<std::endl; }
public: void u2(){ std::cout<<"hi2"<<std::endl; }
};
(), . ( )
RouterI1U2 RouterI2U1 RouterI1U2_I2U1.