#include <iostream>
#include <string>
#include <vector>
#include <memory>

struct in 
{
 std::shared_ptr<void> ptr;
 size_t hash_type;
 void add_strings(){}


 template<typename T, typename... Args>
 void add_strings(T value, Args... args) {
 	std::vector<T> &vec = *(std::vector<T>*)ptr.get();
 	vec.push_back(value);
 	add_strings(args...);
 }
	
 template<typename... Args>
 void add_strings(char const*const value_ptr, Args... args) {
 	std::vector<std::string> &vec = *(std::vector<std::string>*)ptr.get();
 	vec.push_back(std::string(value_ptr));
 	add_strings(args...);
 }	
 
 template<typename... Args>
 in(char const*const value_ptr, Args... args) { 
 	hash_type = typeid(std::string).hash_code();
 	ptr = std::make_shared<std::vector<std::string>>(0);
 	add_strings(value_ptr, args...);
 } 

 template<typename T, typename... Args>
 in(T value, Args... args) { 
 	hash_type = typeid(T).hash_code();
 	ptr = std::make_shared<std::vector<T>>(0);
 	add_strings(value, args...);
 }
};

template<typename T>
bool operator==(T const& str, in const& val) {
	if(val.hash_type == typeid(T).hash_code()) 
	{
		std::vector<T> &vec = *(std::vector<T>*)val.ptr.get();
 		for(auto &i : vec) 
 		{
 			if(i == str)
 				return true;
 		}
	}
 	return false;	
}
// -----------------------------------------------------

int main(void) 
{
	std::string lang, country = "GB";

	if (country == in ("US","GB","AU")) 
	{
		lang="en";
	}
	
	if (country == in (1,2,3)) 
	{
		lang="hz";
	}
	
	int a, b = 10;
	
	if (b == in (1,2,10,3)) 
	{
		lang += " +100500";
	}

	std::cout << "lang = " << lang << std::endl;

	return 0;
}
