2012-08-22 51 views
2

有沒有辦法做這樣的事情的僞代碼(順便說一句,我知道我不能使用模板來做到這一點,這只是爲了說明):操作模板?

template<operator Op> 
int operator Op (int a, number b) { 
    return (a Op to_int(b)); 
} 

你得到的要點權。目前我使用了很多重載來做到這一點,但它太重複了。我試着用void *指針(對於函數args)做一些事情,最終傳遞了runtime-typeid信息,但代碼似乎太涉及了。 任何其他解決辦法....

thanx您的想法

我想少寫覆蓋的方法......我必須寫12只爲+, - ,/,* ..not到提及我想要覆蓋的其他操作。

讓我給你,我想重複少了什麼更具體的例子:

scalar operator Op (scalar a, string b) {..Op..} 
scalar operator Op (scalar a, number b) {..Op..} 
scalar operator Op (scalar a, scalar b) {..Op..} 

的處理是不同的,但是當我需要做的的計算裏面是一樣的,除了運營商是不同的。所以,而不是做12重載的方法,我會做3. 裏面的代碼可能比我的第一個插圖更長,對不起。

我想我找到了一個解決方案: http://en.wikipedia.org/wiki/Barton-Nackman_trick 或升壓庫nevsan指出。

+1

我可能是一個菜鳥,但這個只是看上去錯誤在許多層面上。從我可以收集你想要實現的內容,然後不,你不能這樣做,就像說你想在編譯時創建函數名稱一樣。 –

+0

在'number'中爲'int'添加一個隱式轉換是否合理? – BoBTFish

+0

@casperOne不知道。 –

回答

1

最後,您正在定義一個函數名稱。所以沒有辦法嚴格按照這種語言來做到這一點。

雖然這可能可以通過使用預處理器來完成。

1

免責聲明 - 我反對這樣的:當你試圖做業務就像1+a(其中aA

struct A 
{ 
    operator int() {return 0;} 
}; 

演員將是隱含的。

另外,您不再需要to_int函數。

不要做

4

我想你可以幫助宏做到這一點:

#define DEFINE_NUMBER_OP(op) \ 
int operator op (int a, number b) { \ 
    return (a op to_int(b));\ 
}\ 
\ 
int operator op (number a, int b) { \ 
    return (to_int(a) op tb);\ 
}\ 
\ 
int operator op (number a, number b) { \ 
    return <generic code to do op on numbers>;\ 
}\ 
\ 

然後你使用它: DEFINE_NUMBER_OP(+);

但我反而會考慮重新考慮你的方法。 不要自動讓你的用戶混合不同的類型,但強迫他們明確指出他們想要的數學。僅支持number OP number運算符,而不是隱式支持一堆int運算。

編輯:要詳細一點多,當你開始支持了很多隱含的運營商的它真的很容易犯一個錯誤,並進行不必要的操作可能需要數小時或數天的調試,對編寫代碼一次有明確的指示關於你的意圖(記住你只需要寫一次你的意圖,並且每次讀到代碼時人們都能清楚地看到你的意思,直到時間結束)。

+0

你在Boost代碼中看到了這樣的事情;例如,在'const_string'中。 +1 –

1

這可能會也可能不會幫助您的情況,但結賬提升operators

+0

這實際上不會工作,因爲他的返回類型是「int」,而不是「Number」。 –

1

這實際上可能是一個宏任務:

#define DEFINE_OPERATOR_(op, res, lhs, rhs, ltr, rtr) \ 
    res operator##op(lhs l, rhs r) { return ltr op rtr; } 
#define DEFINE_OPERATOR_L(op, res, lhs, rhs) \ 
    DEFINE_OPERATOR_(op, res, lhs, rhs, to_int(lhs), rhs) 
#define DEFINE_OPERATOR_R(op, res, lhs, rhs) \ 
    DEFINE_OPERATOR_(op, res, lhs, rhs, lhs, to_int(rhs)) 
#define DEFINE_OPERATOR_BOTH(op, mytype, othertype) \ 
    DEFINE_OPERATOR_L(op, othertype, mytype, othertype) \ 
    DEFINE_OPERATOR_R(op, othertype, othertype, mytype) 

DEFINE_OPERATOR_BOTH(*, number, int); 
DEFINE_OPERATOR_BOTH(/, number, int); 
//... 

#undef DEFINE_OPERATOR_BOTH 
#undef DEFINE_OPERATOR_L 
#undef DEFINE_OPERATOR_R 
#undef DEFINE_OPERATOR_