簡體   English   中英

C ++中的符號數據類型

[英]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腳本生成的...

為此構建了enum構造。

一些使用枚舉的好例子

如果您想要一個哈希映射,請考慮std :: unordered_map

C ++中的簡單哈希圖實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM