2013-08-30 54 views
1

的私有成員是否有可能有一個非成員運算符像非會員運營的外國類

bool operator==(const std::string &l, const Token r) 

到無關的類Interpreter的私有成員函數? 我試過這種顯而易見的方式,但它不起作用(太多的參數)。 我知道,已經是冠軍「非成員函數[...]爲成員說:」相反的,但有比功能更好的方式

bool isToken(const std::string &l, const Token r) 

做一個對比是依賴於(非靜態)成員Interpreter

不可能比較Token s到string s之外的Interpreter

一些進一步的信息:令牌是一個枚舉和comparisation依賴於建設一個Interpreter的設置語言。

+1

什麼是'Token',以及如何將''==工作,如果'Token'是LHS? – jxh

+0

令牌是像KEYWORD_ELSE或CONDITION_ALWAYS這樣的枚舉。 KEYWORD_ELSE ==「else」對於「english」解釋器應該爲真解釋器和KEYWORD_ELSE ==「sonst」對於「german」解釋器應該是真的。 – Fabian

+0

此外,如果==運算符是在Intepreter中定義的,您是怎麼想到語法看起來像的?或者您正在尋求一名僅在口譯員環境下工作的操作員,即針對口譯員的成員方法? –

回答

1

這是不可能使一個版本的operator ==你想要的方式。它不能被製成靜態的。如果它是一個成員,那麼它必須有一個參數。

如果你願意爲「複製代碼」,那麼你就可以用命名空間上做手腳。您的通用解釋器可以是一個將特定於語言的派生類作爲模板參數的模板。它依次調用基於語言特定標記的模板化operator==

template <typename TOKEN> 
bool operator == (const std::string &l, const TOKEN token) { 
    return token == l; 
} 

// Language specific interpreters inherit from this template 
template <typename LANG> 
class Interpreter { 
public: 
    void interpret() { 
     std::string s("hi"); 
     if (s == LANG::KEYWORD_ELSE) {} 
    } 
}; 

Interpreter每種語言特定的子類在於特定語言的命名空間。該實現重複了關鍵字的枚舉,但在其他方面則遵循模板實現。

namespace Lang0 { 
    class Interpreter : public ::Interpreter<Lang0::Interpreter> { 
     //... 
    public: 
     enum Token { KEYWORD_ELSE, //... 
        }; 
     static Interpreter & instance() { 
      static Interpreter interpreter; 
      return interpreter; 
     } 
    }; 
} 

namespace Lang1 { 
    class Interpreter : public ::Interpreter<Lang1::Interpreter> { 
     //... 
    public: 
     enum Token { KEYWORD_ELSE, //... 
        }; 
     static Interpreter & instance() { 
      static Interpreter interpreter; 
      return interpreter; 
     } 
    }; 
} 

每個命名空間還提供了operator==比較字符串的語言特定的標記語言具體實施。

namespace Lang0 { 
    bool operator == (const Interpreter::Token token, const std::string &l) { 
     //... 
    } 
} 

namespace Lang1 { 
    bool operator == (const Interpreter::Token token, const std::string &l) { 
     //... 
    } 
} 

而且,如果Interpreter模板實現調用的operator==模板版本,它解析爲相應語言特定的命名空間的語言具體實施。

+0

不幸的是,代碼重複也不起作用。 解釋器將帶有翻譯的給定數據庫加載到地圖中。 是否有一個原因,爲什麼C++不允許這個或它被遺忘/沒有打算? – Fabian

+0

我不知道如何回答你的問題。我的印象是,因爲你想把'operator =='作爲'Interpreter'的成員,所以比較只會發生在'Interpreter'實例的上下文中。這就是爲什麼我認爲上述解決方案適合您的原因。我曾假設英語口譯員將是與德語Intepreter不同的實例。 – jxh

+0

[這裏](http://ideone.com/Obq7Sl)是我想到的IDEONE的模擬。 – jxh

0

由於比較是通過解釋的非靜態成員由(比如說,is_equal()),則需要三個對象作一個比較:一個解釋,一個字符串,一個令牌。

如果你知道恰好有一個有效的解釋對象實例的比較時,你可以有這種情況作出訪問靜態,例如

bool operator==(const std::string &l, const Token r) 
{ 
    return Interpreter::instance().is_equal(l, r); 
} 

其中static member instance()返回執行工作的Interpreter對象。