#include <iostream>
#include <string>
using namespace std;

template<class T>
class SingleParamClass
{
public:
	virtual void func(T arg) = 0;
};

template<class... TYPE_LIST>
class MultiParamClass : public SingleParamClass<TYPE_LIST>...
{
};

class MyMultiParamClass : public MultiParamClass<int, double, string>
{
public:
	void func(int arg) override { cout << "int: " << arg << endl; }
	void func(double arg) override { cout << "dbl: " << arg << endl; }
	void func(string arg) override { cout << "str: " << arg << endl; }
};

int main()
{
	MyMultiParamClass cls;
	cls.func(1);
	cls.func(1.0);
	cls.func("1");
	return 0;
}