enum class的基於namespace的實現

2022-01-28 20:04:41 字數 1110 閱讀 9764

之前實現的列舉類enum class雖然達到了當時期望的功能,但現在在用的時候出現了一些問題。比如新定義了乙個token的類,

定義如下,

class

token

token(

int tp, string

tx)

int type() const

string text() const

friend ostream& operator

<< (ostream& out,const token&token)

protected

:

inttype;

string

text;

};

希望token輸出時,能夠輸出token的型別的名字,這在之前的列舉類裡面已經實現了,但是輸出語句中tokentype.name(type),直接使用了tokentype物件,如果type時exprtokentype,那麼就會出錯,除非name是static的,在tokentype和exprtokentype裡面共用。如果這樣做,name的初始化就會很麻煩,static成員需要在類外初始化,在建構函式中不能對它進行修改,那麼,繼承的exprtokentype也不能在建構函式裡面對它進行修改。這是一種解決方案,name在token對應的.cpp檔案裡面初始化,雖然目前只有main.cpp,其它的都是標頭檔案,但是不得不增加.cpp了。這樣貌似解決了,但token裡面輸出的那一句話還是有問題啊。

另一種方案,使用namespace,將tokentype定義為namespace,擴充套件的時候也不需要繼承,可以直接新增常量型別成員,而name的新增則可以放到對應lexer的初始化裡面。

//

token.h

namespace

tokentype;

const

string name(intx)}

# exprtoken.h

#include

"tname.h

"namespace

tokentype}//

main.cpp

intmain()

本來應該很簡單的問題,為什麼現在搞得這麼複雜呢?

基於IP,基於port和基於網域名稱的三種

1 基於相同ip不同port的虛擬主機 2 將listen欄位改為 listen 80 listen 8888 以上設定表示使用80以及8888埠 3 更改虛擬主機部分為 documentroot var www html website1 documentroot var www html web...

基於函式的索引 建立基於函式的索引

基於函式的索引 1基於函式的索引是常規的b樹索引。2該索引存放的資料是由表中的資料應用函式後得到的,而不是直接存放表中的資料本身。3如果查詢條件包含與索引相同的函式,就可以使用基於函式的索引,提高查詢速度 舉例 測試表 create table student2 sno varchar2 10 pr...

基於Token的認證和基於宣告的標識

openid解決跨站點的認證問題,oauth解決跨站點的授權問題。認證和授權是密不可分的。而openid和oauth這兩套協議出自兩個不同的組織,協議上有相似和重合的之處,所以想將二者整合有些難度。好在openid connect作為openid的下一版本,在oauth 2.0的協議基礎上進行擴充套...