2011-02-07 80 views
0

我有以下問題:C++預處理器和超載問題

讓我們考慮一下,我們有

#define SET callMe 
#define COLUMN(x) #x 

,並在我們的我們的計劃的主塊,我們有如下一行: SET(COLUMN(price)="hi");其中預處理器運行後被翻譯成:

#callMe("price"="hi"); 

我需要的功能callMe簽名是callMe(string str)因此,我們必須做出使"price"="hi""price=hi"和讓callMe函數來處理問題的其餘部分。最後要說的是,我所描述的所有程序都是Table類的一部分。

我唯一的選擇是使用操作符重載=所以"price"="hi"翻譯成想要的人,但我不能得到我應該超載,因爲我首先想到的是做以下過載

#std::string operator=(std::string str)作爲成員Table類的函數,但似乎我無法在正確的軌道上找到它。

任何線索我如何能實現想要的操作?

+0

爲什麼你在使用預處理器呢?只用一個重載操作符創建一組類來創建一個SQL表達式作爲AST就更好了。 – Omnifarious 2011-02-07 21:01:52

回答

3

這對你有好處嗎?

#define SECOND_PASS(x) callMe(#x) 
#define COLUMN(x) x 
#define SET(x) SECOND_PASS(x) 

導致:

callMe("price=\"hi\""); 

這基本上得到預處理器轉換爲字符串之前刪除列。

+0

似乎做了一些很好的幫助因爲它也可以幫助,而不是「嗨」我們有一個整數。感謝您的答覆:) – gchatzip 2011-02-07 21:26:06

0

你的意思是像

#define SET(x) (CallMe(x))

PS - 通常免責聲明有關使用預處理

+0

我認爲我上面的定義仍然可以執行g ++ -E main.cpp會產生callMe(「price」=「hi」),所以我想定義都行! ,我知道預處理器,但我必須這樣做:(謝謝你回答 – gchatzip 2011-02-07 21:02:41

0

這應該與超載的各種邏輯運算符類創建一個抽象語法樹來完成,而不是實際執行操作。然後,您可以將各種SQL表達式表達爲C++代碼,並獲取抽象語法樹,然後將其序列化爲SQL WHERE子句。

這不是非常困難,如果你仔細一點,它會非常高效。這比嘗試使用預處理器hackery創建SQL表達式構建器要好得多。

+0

你是對的,但我們最初組織解決方案的預處理方式,我不能承擔改變原始設計的時間,所以我期待一個解決我的問題,我無法克服,非常感謝線索我肯定會嘗試以後:) – gchatzip 2011-02-07 21:11:46

1

要得到你想要的,你必須編寫你的代碼爲SET(COLUMN(price)"=hi")

對於內置類型,您不能重載operator=()。除此之外,這是爲了維護健康。

C++重載不是爲了讓您強制編譯器解析不同的語言。

P.S.在Table類中超載operator=()只能處理的左側Table的情況。這將需要COLUMN(x)返回一個Table對象,可能不是你想要的。您可以使用適配器類來獲得這種效果,但COLUMN(x)的語法不包括此列的來源,因此您也卡在那裏。

一個出路有的解決方案將是這個樣子:

class ColumnSetter 
{public: 
    ColumnSetter(const char* name): name(name), value(0) {} 
    ColumnSetter& operator=(const char* value_) { value = value_; } 
    operator std::string const &() const { std::string result(name); 
     if(value) { result.append('='); result.append(value); } return result; } 
private: 
    const char* name; 
    const char* value; 
}; 

#define COLUMN(x) ColumnSetter(#x) 

void callMe(const std::string& param); 

格式化和去內聯到任何編碼你有標準。

+0

謝謝你讓我知道。是否有任何線索,如果我仍然想使「價格」=「嗨」是「價格=嗨」,我不能改變語法我想不出別的東西:( – gchatzip 2011-02-07 21:19:14