Вы можете добавить второй конструктор преобразования. Если вы хотите поддерживать любой тип, просто сделайте этот конструктор шаблонным:
template <typename T>
struct S {
T v;
S(T v) : v{v} {}
template <typename U>
S(U v) : v{v} {}
};
Это работает следующим образом:
S<int>{0};
S<S<int>>{0};
S<S<S<int>>>{0};
S<S<S<S<int>>>>{0};
S<double>{0.0};
S<S<double>>{0.0};
S<S<S<double>>>{0.0};
S<S<S<S<double>>>>{0.0};
Живая демонстрация: https://godbolt.org/z/NKEGRz
Обратите внимание, что на самом нижнем уровне применимы оба конструктора, но не шаблонный будет выбран в соответствии с правилами перегрузки C ++.