【问题标题】:how to make explicit conversions from a native type to a user defined type in a template如何在模板中进行从原生类型到用户定义类型的显式转换
【发布时间】:2016-02-08 08:18:57
【问题描述】:

我想让一个类足够灵活,以根据模板中的 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;
}

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

【问题讨论】:

    标签: c++ templates explicit-conversion


    【解决方案1】:

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

    C++11:

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

    C++98:

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

    你会很高兴的。

    【讨论】:

    • 谢谢巴托兹。他们都编译。非常简单,回答了它。
    • 如果可行,您应该投票并将答案标记为正确
    • 对不起巴托兹。我将其标记为正确。我已经尝试过投票,但需要 15 的声誉才能投票给答案。我有 10 个。
    • 这更像是一个笼统的评论,因为您往往不会将问题标记为已回答:)
    • 我现在看到@Bartosz Przybylski 谢谢你的评论。了解我对此并不陌生。我将其他两个问题的答案标记为正确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多