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

Я хочу, чтобы класс был достаточно гибким, чтобы обрабатывать явное преобразование на основе типа 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;
}

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

0

Решение

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

C ++ 11:

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

C ++ 98:

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]