#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;
}
I2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8c3RkZXhjZXB0PgojaW5jbHVkZSA8c3RyaW5nPgoKdHlwZWRlZiBib29sICgqRlApKGNvbnN0IHN0ZDo6c3RyaW5nJik7CnR5cGVkZWYgc3RkOjp2ZWN0b3I8RlA+IEZQRGF0YTsKCnN0ZDo6c2l6ZV90IElERmluZChjb25zdCBzdGQ6OnN0cmluZyYgSUQsIGNvbnN0IEZQRGF0YSYgRlApIHsKCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRlAuc2l6ZSgpOyBpKyspIHsKCQlpZiAoRlBbaV0oSUQpKSB7IHJldHVybiBpOyB9Cgl9CgoJcmV0dXJuIEZQLnNpemUoKTsKCn0KCnRlbXBsYXRlPGNsYXNzIFIsY2xhc3MuLi4gQXJnPgpSIEZhY3Rvcnkoc3RkOjpzaXplX3QgTiwgY29uc3QgQXJnJiAuLi4gQSkgewoKCXN3aXRjaCAoTikKCXsKCWNhc2UgMDoKCQlyZXR1cm4gaW50KEEuLi4pOwoJY2FzZSAxOgoJCXJldHVybiBkb3VibGUoQS4uLik7CglkZWZhdWx0OgoJCXRocm93IHN0ZDo6bG9naWNfZXJyb3IoImZ1bmN0aW9uIEZhY3RvcnkuIGJ5IERlZmF1bHQgY2FzZS4iKTsKCQlicmVhazsKCX0KfQoKdGVtcGxhdGU8Y2xhc3MgVD4KYm9vbCBJRF9DaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgaW4pIHsKCXJldHVybiB0eXBlaWQoVCkubmFtZSgpID09IGluOwp9CgppbnQgbWFpbigpIHsKCWF1dG8gUiA9IEZhY3Rvcnk8aW50PihJREZpbmQodHlwZWlkKGludCkubmFtZSgpLCB7IElEX0NoZWNrPGludD4sSURfQ2hlY2s8ZG91YmxlPiB9KSwgMCk7CgoJcmV0dXJuIDA7Cn0=