0

我想让一个类足够灵活,以处理基于模板中的 typename 类型的显式转换。怎么做到呢?我猜班级将不得不处理转换

请注意,这似乎需要大量代码,但我尽可能地缩短了它。

这是我想做的。

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;
}

提前感谢您的帮助。这个问题需要更好的标签,任何建议都会有所帮助。

4

1 回答 1

1

C++ 可以处理从 int 到 bigNumber 的隐式转换。您需要做的就是为这种情况添加构造函数:

C++11:

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

C++98:

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

你会很高兴的。

于 2015-11-07T06:05:15.817 回答