2015-08-08 72 views
0

現在,我正嘗試在C++中創建一個原型動態類型系統來回答Stack Overflow的另一個問題。有沒有辦法在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

return(compile-time)* type *不能取決於std :: string的(運行時)值。 – 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魔法。

相關問題