[英]Symbol datatype in C++
一些語言包含一種表達不可變符號的構造。 例如,在Ruby中,符號文字具有以下形式:symbolName
。 然后,例如,可以使用它們從映射中有效地獲取值( error_count[:syntax_errors]
),此外,還可以輕松地將它們轉換為字符串( :syntax_error.to_s
)。 我的經驗是,這將創建易於閱讀和可維護的代碼。
C ++中是否有類似的東西(我不想使用整數常量,因為我需要聲明它們,並且它們不能輕易地轉換為字符串;我不想在編譯之前在源文件上運行腳本,做一些花哨的替換)? 我正在尋找使用C預處理器或元模板編程中的一些技巧的解決方案。
C ++ 11中有一個std :: unordered_map <>,但是由於您正在談論“符號文字”,因此實際上可以使用靜態符號更好地做到這一點。 簡單的方法是使用直接C和C預處理器。
#define declare_literal(x) const char x[] = #x
declare_literal(foo); //now "foo" is a global symbol you can use everywhere
這並不能提供您可能正在尋找的單一實例保證。 這實際上比人們希望的要棘手,但是您可以通過一些丑陋的操作來做到:
template <typename CharType, CharType... args>
struct symbol_base {
using self_type = symbol<CharType, args...>;
static constexpr std::size_t char_length = sizeof...(args) / sizeof(CharType);
static constexpr CharType value[char_length] = {CharType(args)...};
static const std::string& as_string() { static const std::basic_string<CharType> val{value, char_length}; return val; }
operator const std::string&() const { return as_string(); }
};
template <char... args>
using symbol = symbol_base<char, args...>;
template <wchar_t... args>
using wsymbol = symbol_base<wchar_t, args...>;
因此,您可以使用以下命令為“ foo”創建符號:
symbol<'f', 'o', 'o'> foo;
不完全優雅,但有效。
C ++中沒有符號 ,因為編譯時和運行時是不同的世界。
但是,您可以玩一些預處理器技巧(請參閱X_macros )。 看到這個 , 這個 ,等等...
因此,您可能有一個定義符號的文件,例如
// file my-symbols.def
MY_SYMBOL(a)
MY_SYMBOL(foo)
#undef MY_SYMBOL
並且您會多次使用它,例如一次聲明一些枚舉:
enum my_symbols_en {
#define MY_SYMBOL(N) sy_##N,
#include "my-symbols.def"
};
如果您不喜歡enum
-s,請使用類似的技巧來聲明其他內容,例如靜態實例...
並一次定義例如輸出例程
std::ostream& operator <<(std::ostream& out, my_symbols_en symb) {
switch (symb) {
#define MY_SYMBOL(Sy) case sy_##N: out << #Sy ; break;
#include "my-symbols.def"
default: std::cerr << "bad symbol" << std::endl; exit(EXIT_FAILURE);
}
return out;
}
同樣適用於輸入,哈希,字符串轉換等,等等。
您還可以在構建框架中使用專門的C ++生成腳本。 例如, my-symbols.def
可能是由某些awk
腳本生成的...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.