Đây là một đoạn lấy từ slide của uet http://uet.vnu.edu.vn/tltk/Learning/...troduction.pdf
Lập trình tổng quát (generic programming)
- Một tư duy lập trình mở, trên quan ₫iểm tổng quát hóa tất cả những gì có thể nhằm ₫ưa ra một khuôn mẫu giải pháp cho nhiều bài toán lập trình cụ thể.
Ưu ₫iểm:
- Giảm tối ₫a lượng mã nguồn
- Tăng nhiều lần giá trị sử dụng lại của phần mềm
- Có thể kết hợp tùy ý với các phương pháp luận khác
- Tính khả chuyển cao
Các hình thức tổng quát hóa:
- Kiểu dữ liệu
- Phép toán cơ bản
- Cấu trúc dữ liệu
- Quản lý bộ nhớ,...
Có rất nhiều phương pháp để lập trình tổng quát, với C++ có thể dùng template.
Đây là một ví dụ về hàm fast_abs(x) tính giá trị tuyệt đối của x với x là kiểu dữ liệu số nguyên hoặc số dấu phẩy động bất kỳ (còn kiểu long double vẫn chưa nghĩa ra cách). Ưu điểm của nó là không cần sử dụng đến các câu lệnh rẽ nhánh, nhờ đó thực hiện rất nhanh.
Mã:
/* * ===================================================================================== * * Filename: fast_abs.c * * Description: * * Version: 1.0 * Created: 03/15/2012 01:40:54 PM * Revision: none * Compiler: gcc * * Author: BOSS14420 (boss14420), boss14420@gmail.com * Company: * * ===================================================================================== */ #include <type_traits>#include <cstdint>#include <cstdlib>#include <cstdio> /* number tag */struct unsigned_integral_number_tag {};struct signed_integral_number_tag {};struct float_number_tag {};/* */ /* integral number traits */template<typename T, bool IsSigned = std::is_signed<T>::value>struct integral_number_traits { typedef signed_integral_number_tag number_tag;}; template<typename T>struct integral_number_traits<T, false> { typedef unsigned_integral_number_tag number_tag;};/* */ /* floating point number traits */template<size_t N> struct float_number_traits; template<> struct float_number_traits<4> { typedef uint32_t int_type; static const int_type SIGN_MASK = 0x7FFFFFFF;}; template<> struct float_number_traits<8> { typedef uint64_t int_type; static const int_type SIGN_MASK = 0x7FFFFFFFFFFFFFFFULL;};/* */ /* number_traits */template<typename T, bool IsIntegral = std::is_integral<T>::value, bool IsFloat = std::is_floating_point<T>::value>struct number_traits { typedef void number_tag;}; // for floating point numbertemplate<typename T>struct number_traits<T, false, true> { typedef float_number_tag number_tag; typedef typename float_number_traits<sizeof(T)>::int_type int_type; static const int_type SIGN_MASK = float_number_traits<sizeof(T)>::SIGN_MASK;}; // for integral numbertemplate<typename T>struct number_traits<T, true, false> { typedef typename integral_number_traits<T>::number_tag number_tag;};/* */ /* fast_abs_dispatch */template<typename T>T fast_abs_dispatch(T a, signed_integral_number_tag){ T sign = a >> ((sizeof(T) << 3) - 1); return (a ^ sign) - sign;} template<typename T>T fast_abs_dispatch(T a, unsigned_integral_number_tag){ return a;} template<typename T>T fast_abs_dispatch(T a, float_number_tag) { typedef typename number_traits<T>::int_type int_type; int_type& a_int = reinterpret_cast<int_type&>(a); a_int &= number_traits<T>::SIGN_MASK; return reinterpret_cast<T&>(a_int);}/* */ template<typename T> T fast_abs(T a) { typename number_traits<T>::number_tag number_tag; return fast_abs_dispatch(a, number_tag);} int main(int argc, char **argv) { std::printf("|%d| = %d
", (short)-6, fast_abs((short)-6)); std::printf("|%u| = %u
", (uint8_t)6, fast_abs((uint8_t)6)); std::printf("|%d| = %d
", -56, fast_abs(-56)); std::printf("|%u| = %u
", 56U, fast_abs(56U)); std::printf("|%lld| = %lld
", -5657849365982634728LL, fast_abs(-5657849365982634728LL)); std::printf("|%lld| = %lld
", 565784982634728LL, fast_abs(565784982634728LL)); std::printf("|%f| = %f
", -6.34f, fast_abs(-6.34f)); std::printf("|%f| = %f
", 2.15, fast_abs(2.15)); // struct A {} a;// fast_abs(a);// short s; std::printf("
short s = "); std::scanf("%hd", &s); std::printf("|%hd| = %hd
", s, fast_abs(s));// std::printf("%d
", i); double d; std::printf("
double d = "); std::scanf("%lf", &d); std::printf("|%f| = %f
", d, fast_abs(d)); return 0;}
Pallet nhựa Lâm Đồng giải pháp hoàn hảo cho nhà kho Pallet nhựa Lâm Đồng là một giải pháp đa năng và hiệu quả trong việc vận chuyển và lưu trữ hàng hóa. Trong đó, pallet nhựa Lâm Đồng không chỉ đáp...
Pallet nhựa Lâm Đồng giải pháp...