2009-09-07 36 views
8

是否有可能在靜態上下文中重載C++類運算符?例如C++靜態運算符重載

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

應該'Class_1 [VAL]'產量類型?你希望做'Class_1 [val] v;'嗎? – 2009-09-07 19:08:00

+1

我打算讓它產生整數值,但類型很好。 – jameszhao00 2009-09-07 19:17:09

+0

在C++中,類型不能在類型系統中表示(只有'std :: type_id'),我想不出任何可以靜態重載的操作符。我建議,不要問你的實現思想在C++中是否可行,而是提出實際的_problem_這是要解決的問題。有人可能會提出一個可行的實施方案。 – sbi 2009-09-07 21:05:16

回答

13

如果您正在尋找使用內置運算符進行元編程:這種事情是不可能的 - 內置運算符對運行時值進行操作,而不是對編譯時值進行操作。

您可以使用boost::mpl是什麼,以及而不是使用內置的運營商,利用其模板,如atop[]plus<a, b>op+

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

如果你指的是運營商的一類工作,這是沒有意義的號,這就像在intdoubleoperator +可以操作。運算符是函數的語法糖,它們操作的是變量(值)而不是類型。

+1

如果你有某種工具類 - 只有靜態成員 - 將某些東西加載到「自己」,然後你想以最簡單的方式訪問 - 使用像'[]'這樣的運算符,這是有意義的。 – 2015-08-26 12:59:23

+1

是的,添加到@ jave.web的評論:它肯定可以在情況下有意義*當類的靜態範圍*中有數據時。 (OP也明確地提到了靜態作用域。)因此,不是像在你的例子中那樣使用簡單的算術,而是像[],(),<<, >>等東西可能對任何類型的複雜管理類都是完美的語法糖。 ,而不會強制單例實例。 – 2015-11-29 19:37:47

5

我不相信這是可能的,但我可能在這方面是錯誤的。我想問你爲什麼要這麼做。而不是在類上而不是在實例上執行操作,也許你只需要在整個應用程序中使用一個實例?在這種情況下,您應該使用the singleton pattern

+1

我曾經使用單身模式像瘋了一樣,但後來因爲單身代碼編寫測試是一件麻煩事而停下來。 – jameszhao00 2009-09-08 01:46:48

1

不,操作員不能是類的靜態成員。改用常規的靜態函數。