#include <typeinfo>
#include <vector>
#include <stdexcept>
#include <string>

typedef bool (*FP)(const std::string&);
typedef std::vector<FP> FPData;

std::size_t IDFind(const std::string& ID, const FPData& FP) {

	for (std::size_t i = 0; i < FP.size(); i++) {
		if (FP[i](ID)) { return i; }
	}

	return FP.size();

}

template<class R,class... Arg>
R Factory(std::size_t N, const Arg& ... A) {

	switch (N)
	{
	case 0:
		return int(A...);
	case 1:
		return double(A...);
	default:
		throw std::logic_error("function Factory. by Default case.");
		break;
	}
}

template<class T>
bool ID_Check(const std::string& in) {
	return typeid(T).name() == in;
}

int main() {
	auto R = Factory<int>(IDFind(typeid(int).name(), { ID_Check<int>,ID_Check<double> }), 0);

	return 0;
}