2015-08-08 3 views
0

Прямо сейчас, я пытаюсь создать прототип динамической системы набора текста в C++ для ответа на другой вопрос о переполнении стека.Есть ли способ иметь литералы типов в C++?

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

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

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

std::string type; 

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

get_type(type) new_variable(); 
+0

Какая помощь? http://en.cppreference.com/w/cpp/language/user_literal – Galik

+0

@Galik Я не уверен, но я склонен сказать «нет», потому что я думаю, что в C++ нет эквивалента 'eval()', поэтому для оператора переменной строкового литерала ничего не значит, если вы не можете динамически оценивать код C++ во время выполнения. – VermillionAzure

+0

Возврат (время компиляции) * type * не может зависеть от значения (runtime) строки std ::. – Jarod42

ответ

1

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

Смежные вопросы