как сделать явные преобразования из собственного типа в пользовательский тип в шаблоне

Я хочу, чтобы класс был достаточно гибким, чтобы обрабатывать явное преобразование на основе типа имени в шаблоне. Как это сделать? Я предполагаю, что классу придется обрабатывать преобразование

Обратите внимание, что это может показаться большим количеством кода, но я сделал его настолько коротким, насколько мог.

Вот что я хотел бы сделать.

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

Заранее благодарю за любую помощь. И этот вопрос нуждается в лучших тегах, любые предложения помогут.


person George Gomes    schedule 07.11.2015    source источник


Ответы (1)


C++ может обрабатывать неявное преобразование из int в bigNumber. Все, что вам нужно сделать, это добавить конструктор для этого случая:

C++11:

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

C++98:

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

и вы будете хорошо идти.

person Bartosz Przybylski    schedule 07.11.2015
comment
Спасибо, Бартош. Они оба компилируются. Ужасно просто Тот ответил на него. - person George Gomes; 07.11.2015
comment
Если это работает, вы должны проголосовать и отметить ответ как правильный - person Bartosz Przybylski; 07.11.2015
comment
Жалко Бартоша. Я отметил это как правильное. Я уже пытался проголосовать за него, но для того, чтобы проголосовать за ответ, нужна репутация 15. у меня 10. - person George Gomes; 08.11.2015
comment
Это было скорее общее замечание, потому что вы склонны не отмечать вопросы как отвеченные :) - person Bartosz Przybylski; 09.11.2015
comment
Теперь я вижу @Bartosz Przybylski, спасибо за ваш комментарий. Поймите, я новичок в этом. Я отметил ответы на два других вопроса как правильные. - person George Gomes; 10.11.2015