Сейчас я пытаюсь создать прототип системы динамической типизации на C ++ для ответа на другой вопрос о переполнении стека.
Но мне интересно, как я мог бы выбрать конкретный тип из варианта.
То, что я хочу, это в основном функция для преобразования ключа непосредственно в тип, а затем чтобы программа создала тип на основе этого литерала типа.
Что я хочу (в псевдокоде):
std::string type;
TYPE get_type(std::string) { ... }
get_type(type) new_variable();
Используя стиль прохождения продолжения, sortof.
template<class T>struct tag{using type=T;};
template<class Tag>using type_t=typename Tag::type;
#define TYPEOF(...) type_t<std::decay_t<decltype(__VA_ARGS__)>>
template<class F>
auto get_type( std::string s, F f ) {
if (s=="int")
return f(tag<int>{});
if (s=="double")
return f(tag<double>{});
}
использовать:
void do_stuff( std::string type ) {
int x = get_type( type, [&](auto tag) {
TYPEOF(tag) var;
return 7;
});
}
в этом случае, var
переменная типа type
имена.
Обратите внимание, что все ветви будут скомпилированы, поэтому все ветви должны создавать корректный код.
В противном случае нет, это невозможно, за исключением constexpr
магия.