Есть ли способ иметь литералы типа в C ++?

Сейчас я пытаюсь создать прототип системы динамической типизации на C ++ для ответа на другой вопрос о переполнении стека.

Но мне интересно, как я мог бы выбрать конкретный тип из варианта.

То, что я хочу, это в основном функция для преобразования ключа непосредственно в тип, а затем чтобы программа создала тип на основе этого литерала типа.

Что я хочу (в псевдокоде):

std::string type;

TYPE get_type(std::string) { ... }

get_type(type) new_variable();

0

Решение

Используя стиль прохождения продолжения, 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 магия.

1

Другие решения


По вопросам рекламы [email protected]