2015-11-07 21 views
0

我想要一個足夠靈活的類來處理基於模板中的類型名類型的顯式轉換。如何做呢?我猜這個班級將不得不處理轉換如何在模板中從本機類型到用戶定義類型進行顯式轉換

請注意,這可能看起來像很多代碼,但我保持儘可能短。

這是我想要做的。

template<typename T> void fooAndBar(T x) 
{ 
    uint64_t count = 0; 

    //i want next line to work for x being either uint64_t or bigNumber 
    while(x <= (T)1000) { 
     count++;//do something 
    } 
} 

int main() { 

    uint64_t y = 1; 
    fooAndBar(y); 

    bigNumber z; 
    fooAndBar(z); 

    return 0; 
} 

與bigNumber定義爲:

#include <vector> 

typedef unsigned long long int uill; 

class bigNumber //just a class that can handle reaaaly big numbers very striped down 
{ 
public: 
    bigNumber(); 
    ~bigNumber() {} 
    bool operator<=(bigNumber rightSide); 
    template<typename T> static bigNumber convertToBigNumber(T in); 
private: 
    std::vector<uill> digits; 
}; 

bigNumber::bigNumber() { digits.push_back(1); } 

bool bigNumber::operator<=(bigNumber rightSide) { 
    // dummy function 
    return digits.back() <= rightSide.digits.back(); 
} 

template<typename T> static bigNumber bigNumber::convertToBigNumber(T in) { 
    bigNumber bn; 
    bn.digits.push_back(in); 
    return bn; 
} 

,但我堅持擰獨立的功能。一個uint64_t中,一個用於bigNumber像這樣

void foo(uint64_t x) { 

    uint64_t count = 0; 

    // NB x is an uint64_t 
    while(x <= 1000) { 
     count++;//do something 
    } 
} 

void bar(bigNumber x) { 

    uint64_t count = 0; 

    // NB x is a bigNumber 
    while(x <= bigNumber::convertToBigNumber(1000)) { 
     count++;//do something 
    } 
} 

int main() { 

    uint64_t y=1; 
    foo(y); 

    bigNumber z ; 
    bar(z); 

    return 0; 
} 

預先感謝任何幫助。這個問題需要更好的標籤,任何建議都會有幫助。

回答

1

C++可以處理從int到bigNumber的隱式轉換。 所有你需要做的是增加構造這種情況:

C++ 11:

bigNumber(uill e) : digits{e} {} 

C++ 98:

bigNumber(uill e) { digits.push_back(e); } 

,你會好到哪裏去。

+0

謝謝Bartosz。他們都編譯。非常簡單那回答了它。 –

+0

如果它有效,你應該投票並將答案標記爲正確的 –

+0

對不起巴託什。我將其標記爲正確。我已經嘗試過投票了,但是需要15的聲望來投票回答。我有10 –