#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=