Используйте template
s и общее программирование, где это возможно.Не полагайтесь на любой тип, если вам не нужно!
Если у вас есть функция, которая берет число и возвращает его, умноженное на 2, напишите его так:
template <typename Number>
inline Number doubleNum(Number n) {
return 2*n;
}
Или даже так:
template <typename RetType, typename NumberType>
inline RetType doubleNum(NumberType n) {
return 2*n;
}
Таким образом, если у вас есть библиотека, которая использует int
s, double
s, uint64_t
s - вы называете это - выможет работать с ним, не переписывая свой код.Если вам нужно работать с двоичными файлами или сетевым программированием, вы можете работать с типами фиксированного размера, не переписывая код.А если вам нужны числа произвольной точности, вы можете работать с классом, который реализует тот же интерфейс, что и примитивный целочисленный тип или тип с плавающей запятой, посредством перегрузки операторов, такой как обертка GMP, без переписывания кода .
И вы можете специализировать шаблонные функции или классы, чтобы оптимизировать конкретные случаи или работать с классами (или C struct
s), которые не соответствуют соответствующему интерфейсу:
/*
* optimization:
* primitive integers can be bit-shifted left to
* achieve multiplication by powers of 2
* (note that any decent compiler will do this
* for you, behind the hood.)
*/
template <>
inline int doubleNum<int>(int n) {
return n<<1;
}
/*
* optimization:
* use assembly code
*/
template <>
inline int32_t doubleNum<int32_t>(int32_t n) {
asm {
...
}
}
/*
* work with awkward number class
*/
template <>
inline AwkwardNumber doubleNum<AwkwardNumber>(AwkwardNumber n) {
n.multiplyBy(2);
return n;
}