#include <iostream>
#include <tuple>
 
template<typename... Ts>
struct base
{
    std::tuple<Ts...> tuple;
};
 
template<typename... Ts>
struct deriv : base<Ts...>
{
};
 
//--------------------------------
 
template<typename T>
void func(const T&)
{
    std::cout << "T" << std::endl;
}
 
template<typename... Ts>
void func(const base<Ts...>&)
{
    std::cout << "base<Ts...>" << std::endl;
}
 
//----------------------------------------
 
int main()
{
    int a;
    base <int, double> b;
    deriv<int, double> c;
 
    func(a);
    func(b);
    func(static_cast<base<int, double> &>(c)); // <--- I want func<base<Ts...>> not func<T> to be called here
 
    exit(0);
}
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+Cgp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4Kc3RydWN0IGJhc2UKewogICAgc3RkOjp0dXBsZTxUcy4uLj4gdHVwbGU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcz4Kc3RydWN0IGRlcml2IDogYmFzZTxUcy4uLj4Kewp9OwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kdm9pZCBmdW5jKGNvbnN0IFQmKQp7CiAgICBzdGQ6OmNvdXQgPDwgIlQiIDw8IHN0ZDo6ZW5kbDsKfQoKdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+CnZvaWQgZnVuYyhjb25zdCBiYXNlPFRzLi4uPiYpCnsKICAgIHN0ZDo6Y291dCA8PCAiYmFzZTxUcy4uLj4iIDw8IHN0ZDo6ZW5kbDsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgppbnQgbWFpbigpCnsKICAgIGludCBhOwogICAgYmFzZSA8aW50LCBkb3VibGU+IGI7CiAgICBkZXJpdjxpbnQsIGRvdWJsZT4gYzsKCiAgICBmdW5jKGEpOwogICAgZnVuYyhiKTsKICAgIGZ1bmMoc3RhdGljX2Nhc3Q8YmFzZTxpbnQsIGRvdWJsZT4gJj4oYykpOyAvLyA8LS0tIEkgd2FudCBmdW5jPGJhc2U8VHMuLi4+PiBub3QgZnVuYzxUPiB0byBiZSBjYWxsZWQgaGVyZQoKICAgIGV4aXQoMCk7Cn0=