    #include <iostream>
    #include <vector>
    #include <type_traits>
    #include <memory>
    using namespace std;
    
    
    
    struct Slave {
    	virtual char const* Type() = 0;
    };
    
    template<typename T>
    struct Slave_T : public Slave{
    	typedef T type;
    	virtual char const* Type() {
    		return typeid( T ).name();
    	}
    };
    
    template <typename ...T>
    struct Master {
    	Master()
    	{
    		MakeSlave<T...,_my_centinel_type>();
    		cout << "All Slaves:" << endl;
    		for (auto const& slave : v){
    			cout << slave ->Type() << endl;
    		}
    	}
    private:
        struct _my_centinel_type {};
    
    	template<typename U, typename ...Rest>
    	typename std::enable_if<!std::is_same<U,_my_centinel_type>::value , void>::type MakeSlave()
    	{
                v.push_back( std::make_shared<Slave_T<U>>());
    		MakeSlave<Rest...>();
    	}
    
        template<typename U>
    	typename std::enable_if<std::is_same<U,_my_centinel_type>::value , void>::type MakeSlave(){
    		
    	}
    
    	vector<shared_ptr<Slave>> v;
    };
    
    int main()
    {
    	Master<int, double, char> m;
    	//Print("Hello", '!', 123, 123);
    	return 0;
    }