ಸಿ ++ ನಲ್ಲಿ ಟೆಂಪ್ಲೇಟ್ ಕಾರ್ಯ ಕರೆಗಳನ್ನು ಸುಗಮಗೊಳಿಸಲಾಗುತ್ತಿದೆ
ಟೆಂಪ್ಲೇಟ್ಗಳು ಆಧುನಿಕ ಸಿ ++ ಪ್ರೋಗ್ರಾಮಿಂಗ್ನ ಒಂದು ಮೂಲಾಧಾರವಾಗಿದ್ದು, ಡೆವಲಪರ್ಗಳಿಗೆ ಹೊಂದಿಕೊಳ್ಳುವ ಮತ್ತು ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ಕೋಡ್ ಬರೆಯಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಟೆಂಪ್ಲೇಟ್ ಕಾರ್ಯ ಸದಸ್ಯರೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವುದರಿಂದ ಆಗಾಗ್ಗೆ ಪುನರಾವರ್ತಿತ ಬಾಯ್ಲರ್ ಅನ್ನು ಪರಿಚಯಿಸುತ್ತದೆ, ಇದು ಕೋಡ್ಬೇಸ್ ಅನ್ನು ಅಸ್ತವ್ಯಸ್ತಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಓದುವಿಕೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ. ಇದು ಪ್ರಶ್ನೆಯನ್ನು ಹುಟ್ಟುಹಾಕುತ್ತದೆ: ನಾವು ಅಂತಹ ಮಾದರಿಗಳನ್ನು ಸರಳಗೊಳಿಸಬಹುದೇ?
ಒಂದು ತರಗತಿಯಲ್ಲಿ ನೀವು ಅನೇಕ ಟೆಂಪ್ಲೇಟೆಡ್ ಸದಸ್ಯ ಕಾರ್ಯಗಳನ್ನು ಹೊಂದಿರುವ ಸನ್ನಿವೇಶವನ್ನು g ಹಿಸಿ, ಪ್ರತಿಯೊಂದೂ `ಚಾರ್`,` ಇಂಟ್`, ಮತ್ತು `ಫ್ಲೋಟ್` ನಂತಹ ಪ್ರಕಾರಗಳ ಅನುಕ್ರಮದಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ. ಪ್ರತಿಯೊಂದು ಪ್ರಕಾರಕ್ಕೂ ಪ್ರತಿ ಕಾರ್ಯವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಕರೆಯುವ ಬದಲು, ಸ್ವಚ್ and ಮತ್ತು ಸೊಗಸಾದ ರವಾನೆದಾರರ ಕಾರ್ಯದಲ್ಲಿ ತರ್ಕವನ್ನು ಕೇಂದ್ರೀಕರಿಸುವುದು ಉತ್ತಮವಲ್ಲವೇ? ಇದು ಪುನರುಕ್ತಿ ಗಮನಾರ್ಹವಾಗಿ ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸುತ್ತದೆ. 🚀
ಟೆಂಪ್ಲೇಟ್ ನಿಯತಾಂಕಗಳಾಗಿ ಟೆಂಪ್ಲೇಟೆಡ್ ಸದಸ್ಯರ ಕಾರ್ಯಗಳನ್ನು ರವಾನಿಸಲು ಪ್ರಯತ್ನಿಸುವುದು ನೈಸರ್ಗಿಕ ಪರಿಹಾರದಂತೆ ಕಾಣಿಸಬಹುದು. ಆದಾಗ್ಯೂ, ಸಿ ++ ನ ಪ್ರಕಾರದ ವ್ಯವಸ್ಥೆ ಮತ್ತು ಟೆಂಪ್ಲೇಟ್ ಸಿಂಟ್ಯಾಕ್ಸ್ನ ಸಂಕೀರ್ಣತೆಗಳಿಂದಾಗಿ ಇದನ್ನು ಸಾಧಿಸುವುದು ನೇರವಾಗಿಲ್ಲ. ಅಂತಹ ಮಾದರಿಯನ್ನು ನೇರವಾಗಿ ಕಾರ್ಯಗತಗೊಳಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ ಡೆವಲಪರ್ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಕಂಪೈಲರ್ ದೋಷಗಳಿಗೆ ಓಡುತ್ತಾರೆ.
ಈ ಲೇಖನದಲ್ಲಿ, ರವಾನೆ ಮಾಡುವ ಕಾರ್ಯವನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸಲು ಸಾಧ್ಯವಿದೆಯೇ ಎಂದು ನಾವು ಅನ್ವೇಷಿಸುತ್ತೇವೆ, ಅದು ಪ್ರಕಾರಗಳ ಅನುಕ್ರಮವನ್ನು ಪುನರಾವರ್ತಿಸಬಹುದು ಮತ್ತು ವಿಭಿನ್ನ ಟೆಂಪ್ಲೇಟೆಡ್ ಸದಸ್ಯ ಕಾರ್ಯಗಳನ್ನು ಆಹ್ವಾನಿಸುತ್ತೇವೆ. ಸವಾಲುಗಳು ಮತ್ತು ಸಂಭಾವ್ಯ ಪರಿಹಾರಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ನಾವು ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳ ಮೂಲಕ ನಡೆಯುತ್ತೇವೆ. ನಾವು ಧುಮುಕುವುದಿಲ್ಲ! 🛠
ಸ ೦ ತಾನು | ಬಳಕೆಯ ಉದಾಹರಣೆ |
---|---|
std::tuple | ವಿಭಿನ್ನ ರೀತಿಯ ಸ್ಥಿರ ಸಂಖ್ಯೆಯ ಅಂಶಗಳನ್ನು ಹಿಡಿದಿಟ್ಟುಕೊಳ್ಳುವ ಕಂಟೇನರ್. ರವಾನೆದಾರರ ಕಾರ್ಯದಲ್ಲಿ ಪುನರಾವರ್ತಿಸಬೇಕಾದ ಪ್ರಕಾರಗಳ ಅನುಕ್ರಮವನ್ನು ಸಂಗ್ರಹಿಸಲು ಇಲ್ಲಿ ಬಳಸಲಾಗುತ್ತದೆ. |
std::tuple_element | ಟ್ಯುಪಲ್ನಲ್ಲಿ ನಿರ್ದಿಷ್ಟ ಅಂಶದ ಪ್ರಕಾರಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಅನುಮತಿಸುತ್ತದೆ. ಪುನರಾವರ್ತನೆಯ ಸಮಯದಲ್ಲಿ ನಿರ್ದಿಷ್ಟ ಸೂಚ್ಯಂಕದಲ್ಲಿ ಪ್ರಕಾರವನ್ನು ಹಿಂಪಡೆಯಲು ಬಳಸಲಾಗುತ್ತದೆ. |
std::index_sequence | ಸೂಚ್ಯಂಕಗಳನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ನಿರ್ದಿಷ್ಟಪಡಿಸದೆ ಟಪಲ್ ಪ್ರಕಾರಗಳನ್ನು ಪುನರಾವರ್ತಿಸಲು ಬಳಸುವ ಪೂರ್ಣಾಂಕಗಳ ಕಂಪೈಲ್-ಸಮಯದ ಅನುಕ್ರಮವನ್ನು ಉತ್ಪಾದಿಸುತ್ತದೆ. |
std::make_index_sequence | 0 ರಿಂದ N-1 ರವರೆಗೆ ಪೂರ್ಣಾಂಕಗಳೊಂದಿಗೆ STD :: INDEX_SEVENCE ಅನ್ನು ರಚಿಸುತ್ತದೆ. ಕಂಪೈಲ್-ಸಮಯ-ಸುರಕ್ಷಿತ ರೀತಿಯಲ್ಲಿ ಟಪಲ್ ಪ್ರಕಾರಗಳ ಮೇಲೆ ಪುನರಾವರ್ತನೆಯನ್ನು ಸುಗಮಗೊಳಿಸುತ್ತದೆ. |
Fold Expressions | ಸಿ ++ 17 ರಲ್ಲಿ ಪರಿಚಯಿಸಲಾದ, ನಿಯತಾಂಕಗಳ ಪ್ಯಾಕ್ ಮೇಲೆ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಅನ್ವಯಿಸಲು ಪಟ್ಟು ಅಭಿವ್ಯಕ್ತಿಗಳನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. ಇಲ್ಲಿ, ಪ್ರತಿ ಪ್ರಕಾರಕ್ಕೂ ಟೆಂಪ್ಲೇಟೆಡ್ ಕಾರ್ಯಗಳನ್ನು ಟ್ಯುಪಲ್ನಲ್ಲಿ ಕರೆಯಲು ಬಳಸಲಾಗುತ್ತದೆ. |
template template parameters | ಸಿ ++ ನಲ್ಲಿನ ವಿಶೇಷ ವೈಶಿಷ್ಟ್ಯವು ಟೆಂಪ್ಲೇಟ್ ಅನ್ನು (ಉದಾ., ಎಫ್ಎನ್) ಮತ್ತೊಂದು ಟೆಂಪ್ಲೇಟ್ಗೆ ನಿಯತಾಂಕವಾಗಿ ಹಾದುಹೋಗಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ. ಕಾರ್ಯ ಕರೆಗಳನ್ನು ಸಾಮಾನ್ಯೀಕರಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. |
Lambda with Variadic Templates | ಹಾದುಹೋಗುವ ಟೆಂಪ್ಲೇಟೆಡ್ ಫಂಕ್ಷನ್ ಕರೆಗಳನ್ನು ಪ್ರತಿ ಪ್ರಕಾರಕ್ಕೂ ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಸರಳೀಕರಿಸಲು ವೈವಿಧ್ಯಮಯ ಟೆಂಪ್ಲೆಟ್ನೊಂದಿಗೆ ಇನ್ಲೈನ್ ಕಾರ್ಯವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. |
decltype | ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ಅಭಿವ್ಯಕ್ತಿಯ ಪ್ರಕಾರವನ್ನು ನಿರ್ಣಯಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ. ಕಾರ್ಯ ವಾದಗಳ ಪ್ರಕಾರ ಅಥವಾ ರಿಟರ್ನ್ ಪ್ರಕಾರಗಳನ್ನು er ಹಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ. |
typeid | ರನ್ಟೈಮ್ ಪ್ರಕಾರದ ಮಾಹಿತಿಯನ್ನು ಒದಗಿಸುತ್ತದೆ. ಈ ಸ್ಕ್ರಿಪ್ಟ್ನಲ್ಲಿ, ಪ್ರದರ್ಶನ ಉದ್ದೇಶಗಳಿಗಾಗಿ ಮರಣದಂಡನೆಯ ಸಮಯದಲ್ಲಿ ಪ್ರಕಾರದ ಹೆಸರನ್ನು ಮುದ್ರಿಸಲು ಇದನ್ನು ಬಳಸಲಾಗುತ್ತದೆ. |
ಸಿ ++ ನಲ್ಲಿ ಮಾಸ್ಟರಿಂಗ್ ಟೆಂಪ್ಲೇಟ್ ಕಾರ್ಯ ರವಾನೆದಾರರು
ಮೇಲೆ ಒದಗಿಸಲಾದ ಸ್ಕ್ರಿಪ್ಟ್ಗಳು ಸಿ ++ ನಲ್ಲಿ ಒಂದು ನಿರ್ದಿಷ್ಟ ಸವಾಲನ್ನು ನಿಭಾಯಿಸುತ್ತವೆ: ಒಂದೇ ರೀತಿಯ ಇನ್ಪುಟ್ ಪ್ರಕಾರಗಳಿಗೆ ವಿಭಿನ್ನ ಟೆಂಪ್ಲೇಟ್ ಸದಸ್ಯ ಕಾರ್ಯಗಳನ್ನು ಸ್ವಚ್ and ಮತ್ತು ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ರೀತಿಯಲ್ಲಿ ಕರೆಯುವುದು. ಕೇಂದ್ರ ರವಾನೆದಾರರ ಕಾರ್ಯವನ್ನು ರಚಿಸುವ ಮೂಲಕ ಬಾಯ್ಲರ್ಪ್ಲೇಟ್ ಕೋಡ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡುವುದು ಪ್ರಾಥಮಿಕ ಗುರಿಯಾಗಿದೆ. ಬಳಸುವುದು ಟೆಂಪ್ಲೇಟ್ ಮೆಟಾಪ್ರೊಗ್ರಾಮಿಂಗ್. `Std :: tuple`, variadic ಟೆಂಪ್ಲೆಟ್ಗಳು ಮತ್ತು ಪಟ್ಟು ಅಭಿವ್ಯಕ್ತಿಗಳಂತಹ ಸುಧಾರಿತ ಪರಿಕರಗಳನ್ನು ನಿಯಂತ್ರಿಸುವ ಮೂಲಕ ಇದನ್ನು ಸಾಧಿಸಲಾಗುತ್ತದೆ, ಇದು ಪರಿಹಾರವನ್ನು ಹೊಂದಿಕೊಳ್ಳುವ ಮತ್ತು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಮಾಡುತ್ತದೆ. 🚀
ಮೊದಲ ವಿಧಾನವು ಪ್ರಕಾರಗಳ ಅನುಕ್ರಮವನ್ನು ಹಿಡಿದಿಡಲು `std :: tuple` ಅನ್ನು ಬಳಸುವುದರ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸುತ್ತದೆ. `Std :: tuple_element` ಮತ್ತು` std :: index_vendence` ಅನ್ನು ಸಂಯೋಜಿಸುವ ಮೂಲಕ, ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ನಾವು ಈ ಪ್ರಕಾರಗಳನ್ನು ಪುನರಾವರ್ತಿಸಬಹುದು. ಪ್ರತಿ ಪ್ರಕಾರಕ್ಕೂ ಸರಿಯಾದ ಟೆಂಪ್ಲೇಟೆಡ್ ಸದಸ್ಯರ ಕಾರ್ಯವನ್ನು ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಆಹ್ವಾನಿಸಲು `for_each_type` ಅನುಷ್ಠಾನಕ್ಕೆ ಇದು ಅನುಮತಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಸ್ಕ್ರಿಪ್ಟ್ `ಎ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ
ಎರಡನೆಯ ವಿಧಾನವು ಹೆಚ್ಚು ಸಂಕ್ಷಿಪ್ತ ರೀತಿಯಲ್ಲಿ ಇದೇ ರೀತಿಯ ಕಾರ್ಯವನ್ನು ಸಾಧಿಸಲು ಲ್ಯಾಂಬ್ಡಾ ಕಾರ್ಯಗಳನ್ನು ವೈವಿಧ್ಯಮಯ ಟೆಂಪ್ಲೆಟ್ಗಳೊಂದಿಗೆ ಬಳಸುತ್ತದೆ. ಇಲ್ಲಿ, ಲ್ಯಾಂಬ್ಡಾವನ್ನು `for_each_type` ಗೆ ರವಾನಿಸಲಾಗುತ್ತದೆ, ಇದು ಟೈಪ್ ಪ್ಯಾಕ್ ಮೇಲೆ ಪುನರಾವರ್ತಿಸುತ್ತದೆ ಮತ್ತು ಪ್ರತಿ ಪ್ರಕಾರಕ್ಕೂ ಸೂಕ್ತವಾದ ಕಾರ್ಯವನ್ನು ಆಹ್ವಾನಿಸುತ್ತದೆ. ಆಧುನಿಕ ಸಿ ++ ಪ್ರೋಗ್ರಾಮಿಂಗ್ನಲ್ಲಿ ಲ್ಯಾಂಬ್ಡಾ ವಿಧಾನವನ್ನು ಹೆಚ್ಚಾಗಿ ಆದ್ಯತೆ ನೀಡಲಾಗುತ್ತದೆ ಏಕೆಂದರೆ ಇದು ಅನುಷ್ಠಾನವನ್ನು ಸರಳಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಟ್ಯುಪಲ್ಗಳಂತಹ ಸಂಕೀರ್ಣ ಸಾಧನಗಳ ಮೇಲಿನ ಅವಲಂಬನೆಗಳನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ಈ ವಿಧಾನವು `ಎ ಅನ್ನು ಬದಲಿಸುವಂತಹ ಕಾರ್ಯ ಕರೆಗಳನ್ನು ವಿಸ್ತರಿಸಲು ಅಥವಾ ಮಾರ್ಪಡಿಸಲು ಸುಲಭಗೊಳಿಸುತ್ತದೆ
ಎರಡೂ ವಿಧಾನಗಳು ಸಿ ++ 17 ವೈಶಿಷ್ಟ್ಯಗಳಾದ ಪಟ್ಟು ಅಭಿವ್ಯಕ್ತಿಗಳು ಮತ್ತು `std :: make_index_vendence` ನಂತಹ ಲಾಭವನ್ನು ಪಡೆದುಕೊಳ್ಳುತ್ತವೆ. ಈ ವೈಶಿಷ್ಟ್ಯಗಳು ಎಲ್ಲಾ ಕಾರ್ಯಾಚರಣೆಗಳು ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ಸಂಭವಿಸುತ್ತವೆ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳುವ ಮೂಲಕ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ, ಇದು ರನ್ಟೈಮ್ ಓವರ್ಹೆಡ್ ಅನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ, `ಟೈಪಿಐಡಿ` ಬಳಸಿ ರನ್ಟೈಮ್ ಪ್ರಕಾರದ ಮಾಹಿತಿಯನ್ನು ಸೇರಿಸುವುದು ಸ್ಪಷ್ಟತೆಯನ್ನು ಸೇರಿಸುತ್ತದೆ, ವಿಶೇಷವಾಗಿ ಡೀಬಗ್ ಅಥವಾ ಶೈಕ್ಷಣಿಕ ಉದ್ದೇಶಗಳಿಗಾಗಿ. ರವಾನೆದಾರರಲ್ಲಿ ಯಾವ ಪ್ರಕಾರಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ದೃಶ್ಯೀಕರಿಸುವಾಗ ಇದು ಸಹಾಯಕವಾಗಿರುತ್ತದೆ. ಒಟ್ಟಾರೆಯಾಗಿ, ಒದಗಿಸಿದ ಪರಿಹಾರಗಳು ಶಕ್ತಿಯನ್ನು ಹೇಗೆ ಬಳಸಿಕೊಳ್ಳಬೇಕು ಎಂಬುದನ್ನು ತೋರಿಸುತ್ತದೆ ಸಿ ++ ಟೆಂಪ್ಲೆಟ್ಗಳು ಕ್ಲೀನರ್ ಮತ್ತು ಹೆಚ್ಚು ನಿರ್ವಹಿಸಬಹುದಾದ ಕೋಡ್ ಬರೆಯಲು. ಪುನರಾವರ್ತಿತ ತರ್ಕವನ್ನು ಅಮೂರ್ತಗೊಳಿಸುವ ಮೂಲಕ, ಅಭಿವರ್ಧಕರು ದೃ and ವಾದ ಮತ್ತು ಸ್ಕೇಲೆಬಲ್ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ನಿರ್ಮಿಸುವತ್ತ ಗಮನ ಹರಿಸಬಹುದು. 🛠
ಸಿ ++ ನಲ್ಲಿ ಟೆಂಪ್ಲೇಟ್ ಸದಸ್ಯರಿಗಾಗಿ ರವಾನೆ ಕಾರ್ಯಗಳನ್ನು ಅನುಷ್ಠಾನಗೊಳಿಸುವುದು
ಈ ಪರಿಹಾರವು ಸಿ ++ ಪ್ರೋಗ್ರಾಮಿಂಗ್ನ ಮೇಲೆ ಕೇಂದ್ರೀಕರಿಸುತ್ತದೆ ಮತ್ತು ಟೆಂಪ್ಲೇಟ್ ಸದಸ್ಯರಿಗಾಗಿ ರವಾನೆ ಕಾರ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ಮಾಡ್ಯುಲರ್ ಮತ್ತು ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ವಿಧಾನಗಳನ್ನು ಪರಿಶೋಧಿಸುತ್ತದೆ.
#include <iostream>
#include <tuple>
#include <utility>
template <typename... Types>
struct A {
template <typename T>
void a() {
std::cout << "Function a with type: " << typeid(T).name() << std::endl;
}
template <typename T>
void b() {
std::cout << "Function b with type: " << typeid(T).name() << std::endl;
}
template <template <typename> class Fn, typename Tuple, std::size_t... Is>
void for_each_type_impl(std::index_sequence<Is...>) {
(Fn<std::tuple_element_t<Is, Tuple>>::invoke(*this), ...);
}
template <template <typename> class Fn>
void for_each_type() {
using Tuple = std::tuple<Types...>;
for_each_type_impl<Fn, Tuple>(std::make_index_sequence<sizeof...(Types)>{});
}
};
template <typename T>
struct FnA {
static void invoke(A<char, int, float> &obj) {
obj.a<T>();
}
};
template <typename T>
struct FnB {
static void invoke(A<char, int, float> &obj) {
obj.b<T>();
}
};
int main() {
A<char, int, float> obj;
obj.for_each_type<FnA>();
obj.for_each_type<FnB>();
return 0;
}
ವೇರಿಯಾಡಿಕ್ ಟೆಂಪ್ಲೇಟ್ಗಳು ಮತ್ತು ಲ್ಯಾಂಬ್ಡಾ ಕಾರ್ಯಗಳನ್ನು ಬಳಸುವ ಪರ್ಯಾಯ ವಿಧಾನ
ಈ ಪರಿಹಾರವು ಉತ್ತಮ ನಮ್ಯತೆ ಮತ್ತು ಕನಿಷ್ಠ ಬಾಯ್ಲರ್ಗಾಗಿ ಲ್ಯಾಂಬ್ಡಾ ಕಾರ್ಯಗಳು ಮತ್ತು ವೈವಿಧ್ಯಮಯ ಟೆಂಪ್ಲೆಟ್ಗಳನ್ನು ಬಳಸಿಕೊಂಡು ಹೆಚ್ಚು ಸಂಕ್ಷಿಪ್ತ ವಿಧಾನವನ್ನು ತೋರಿಸುತ್ತದೆ.
#include <iostream>
#include <tuple>
template <typename... Types>
struct A {
template <typename T>
void a() {
std::cout << "Function a with type: " << typeid(T).name() << std::endl;
}
template <typename T>
void b() {
std::cout << "Function b with type: " << typeid(T).name() << std::endl;
}
template <typename Fn>
void for_each_type(Fn fn) {
(fn.template operator()<Types>(*this), ...);
}
};
int main() {
A<char, int, float> obj;
auto call_a = [](auto &self) {
self.template a<decltype(self)>();
};
auto call_b = [](auto &self) {
self.template b<decltype(self)>();
};
obj.for_each_type(call_a);
obj.for_each_type(call_b);
return 0;
}
ಸುಧಾರಿತ ಸಿ ++ ತಂತ್ರಗಳೊಂದಿಗೆ ಟೆಂಪ್ಲೇಟ್ ಕಾರ್ಯ ರವಾನೆಯನ್ನು ಉತ್ತಮಗೊಳಿಸುವುದು
ಸಿ ++ ನಲ್ಲಿ ಟೆಂಪ್ಲೇಟ್ ಫಂಕ್ಷನ್ ಡಿಸ್ಪ್ಯಾಚ್ ಅನ್ನು ಬಳಸುವ ಕಡಿಮೆ-ಪರಿಶೋಧಿಸಿದ ಅಂಶಗಳಲ್ಲಿ ಒಂದು ಅನುಷ್ಠಾನವನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಭವಿಷ್ಯದ ವಿಸ್ತರಣೆಗಳಿಗೆ ನಮ್ಯತೆಯನ್ನು ಖಾತರಿಪಡಿಸುತ್ತದೆ. ಕೀಲಿಯು ಸತತವಾಗಿರುತ್ತದೆ ಟೆಂಪ್ಲೇಟ್ ವಿಶೇಷತೆ ವೇರಿಯಾಡಿಕ್ ಟೆಂಪ್ಲೆಟ್ಗಳ ಜೊತೆಗೆ. ಟೆಂಪ್ಲೇಟ್ ವಿಶೇಷತೆಯು ಕೆಲವು ಪ್ರಕಾರಗಳಿಗೆ ನಿರ್ದಿಷ್ಟ ನಡವಳಿಕೆಯನ್ನು ಸರಿಹೊಂದಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ, ಕೆಲವು ಪ್ರಕಾರಗಳಿಗೆ ಕಸ್ಟಮ್ ತರ್ಕದ ಅಗತ್ಯವಿದ್ದಾಗ ಇದು ವಿಶೇಷವಾಗಿ ಉಪಯುಕ್ತವಾಗಿದೆ. ರವಾನೆದಾರರ ಕಾರ್ಯದೊಂದಿಗೆ ಇದನ್ನು ಸಂಯೋಜಿಸುವ ಮೂಲಕ, ಹೊಸ ಅವಶ್ಯಕತೆಗಳಿಗೆ ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಹೊಂದಿಕೊಳ್ಳುವ ಇನ್ನೂ ಹೆಚ್ಚು ದೃ ust ವಾದ ಮತ್ತು ವಿಸ್ತರಿಸಬಹುದಾದ ವ್ಯವಸ್ಥೆಯನ್ನು ನೀವು ರಚಿಸಬಹುದು.
ಕಂಪೈಲ್-ಟೈಮ್ ದೋಷಗಳನ್ನು ಮನೋಹರವಾಗಿ ನಿರ್ವಹಿಸುವುದು ಮತ್ತೊಂದು ಪರಿಗಣನೆಯಾಗಿದೆ. ಸಂಕೀರ್ಣ ಟೆಂಪ್ಲೆಟ್ಗಳನ್ನು ಬಳಸುವಾಗ, ಸಾಮಾನ್ಯ ಸಮಸ್ಯೆಯೆಂದರೆ ಡೀಬಗ್ ಮಾಡುವುದನ್ನು ಕಷ್ಟಕರವಾಗಿಸುವ ರಹಸ್ಯ ದೋಷ ಸಂದೇಶಗಳು. ಇದನ್ನು ತಗ್ಗಿಸಲು, ಪರಿಕಲ್ಪನೆಗಳು ಅಥವಾ sfinae (ಪರ್ಯಾಯ ವೈಫಲ್ಯವು ದೋಷವಲ್ಲ) ಅನ್ನು ಬಳಸಿಕೊಳ್ಳಬಹುದು. ಸಿ ++ 20 ರಲ್ಲಿ ಪರಿಚಯಿಸಲಾದ ಪರಿಕಲ್ಪನೆಗಳು, ಡೆವಲಪರ್ಗಳಿಗೆ ಟೆಂಪ್ಲೇಟ್ಗಳಿಗೆ ರವಾನಿಸಲಾದ ಪ್ರಕಾರಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲು ಅನುವು ಮಾಡಿಕೊಡುತ್ತದೆ, ರವಾನೆದಾರರಲ್ಲಿ ಮಾನ್ಯ ಪ್ರಕಾರಗಳನ್ನು ಮಾತ್ರ ಬಳಸಲಾಗಿದೆಯೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ. ಇದು ಕ್ಲೀನರ್ ದೋಷ ಸಂದೇಶಗಳು ಮತ್ತು ಉತ್ತಮ ಕೋಡ್ ಸ್ಪಷ್ಟತೆಗೆ ಕಾರಣವಾಗುತ್ತದೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ, ಎಸ್ಎಫ್ಐಎಎಇ ಬೆಂಬಲಿಸದ ಪ್ರಕಾರಗಳಿಗೆ ಫಾಲ್ಬ್ಯಾಕ್ ಅನುಷ್ಠಾನಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ, ಎಡ್ಜ್ ಪ್ರಕರಣಗಳು ಎದುರಾದಾಗಲೂ ನಿಮ್ಮ ರವಾನೆದಾರರು ಕ್ರಿಯಾತ್ಮಕವಾಗಿ ಉಳಿದಿದ್ದಾರೆ ಎಂದು ಖಚಿತಪಡಿಸುತ್ತದೆ.
ಕೊನೆಯದಾಗಿ, ಟೆಂಪ್ಲೇಟ್ ಮೆಟಾಪ್ರೊಗ್ರಾಮಿಂಗ್ನ ಕಾರ್ಯಕ್ಷಮತೆಯ ಪರಿಣಾಮಗಳನ್ನು ಗಮನಿಸುವುದು ಯೋಗ್ಯವಾಗಿದೆ. ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ಹೆಚ್ಚಿನ ಗಣನೆಯು ಸಂಭವಿಸುವುದರಿಂದ, `STD :: TUPLE` ಅಥವಾ ಪಟ್ಟು ಅಭಿವ್ಯಕ್ತಿಗಳಂತಹ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಸುವುದರಿಂದ ಕಂಪೈಲ್ ಸಮಯವನ್ನು ಗಮನಾರ್ಹವಾಗಿ ಹೆಚ್ಚಿಸಬಹುದು, ವಿಶೇಷವಾಗಿ ದೊಡ್ಡ ಪ್ರಕಾರದ ಪ್ಯಾಕ್ಗಳನ್ನು ನಿರ್ವಹಿಸುವಾಗ. ಇದನ್ನು ಪರಿಹರಿಸಲು, ಡೆವಲಪರ್ಗಳು ಸಂಕೀರ್ಣ ತರ್ಕವನ್ನು ಸಣ್ಣ, ಮರುಬಳಕೆ ಮಾಡಬಹುದಾದ ಟೆಂಪ್ಲೆಟ್ಗಳಾಗಿ ವಿಭಜಿಸುವ ಮೂಲಕ ಅಥವಾ ಒಂದೇ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಸಂಸ್ಕರಿಸಿದ ಪ್ರಕಾರಗಳ ಸಂಖ್ಯೆಯನ್ನು ಸೀಮಿತಗೊಳಿಸುವ ಮೂಲಕ ಅವಲಂಬನೆಗಳನ್ನು ಕಡಿಮೆ ಮಾಡಬಹುದು. ಸ್ಕೇಲೆಬಲ್ ಸಿ ++ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸುವಾಗ ಕ್ರಿಯಾತ್ಮಕತೆ ಮತ್ತು ಕಂಪೈಲ್-ಟೈಮ್ ದಕ್ಷತೆಯ ನಡುವಿನ ಈ ಸಮತೋಲನವು ನಿರ್ಣಾಯಕವಾಗಿದೆ. 🚀
ಸಿ ++ ನಲ್ಲಿ ಟೆಂಪ್ಲೇಟ್ ಕಾರ್ಯ ರವಾನೆದಾರರ ಬಗ್ಗೆ ಸಾಮಾನ್ಯ ಪ್ರಶ್ನೆಗಳು
- ಬಳಸುವ ಉದ್ದೇಶವೇನು? std::tuple ಈ ಸ್ಕ್ರಿಪ್ಟ್ಗಳಲ್ಲಿ?
- std::tuple ಕಂಪೈಲ್ ಸಮಯದಲ್ಲಿ ಪ್ರಕಾರಗಳ ಅನುಕ್ರಮವನ್ನು ಸಂಗ್ರಹಿಸಲು ಮತ್ತು ಪುನರಾವರ್ತಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ, ಹಸ್ತಚಾಲಿತ ಪುನರಾವರ್ತನೆಯಿಲ್ಲದೆ ಪ್ರಕಾರ-ನಿರ್ದಿಷ್ಟ ಕಾರ್ಯಾಚರಣೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.
- ಹೇಗೆ ಮಾಡುತ್ತದೆ fold expressions ಟೆಂಪ್ಲೇಟ್ ಪುನರಾವರ್ತನೆಯನ್ನು ಸರಳಗೊಳಿಸುವುದೇ?
- Fold expressions.
- Sfinae ಎಂದರೇನು, ಮತ್ತು ಇಲ್ಲಿ ಅದು ಹೇಗೆ ಉಪಯುಕ್ತವಾಗಿದೆ?
- Sfinae, ಅಥವಾ "ಬದಲಿ ವೈಫಲ್ಯವು ದೋಷವಲ್ಲ" ಎಂಬುದು ಕೆಲವು ಪ್ರಕಾರಗಳು ಅಥವಾ ಷರತ್ತುಗಳನ್ನು ಪೂರೈಸದಿದ್ದಾಗ ಟೆಂಪ್ಲೆಟ್ಗಳಿಗೆ ಪರ್ಯಾಯ ಅನುಷ್ಠಾನಗಳನ್ನು ಒದಗಿಸುವ ತಂತ್ರವಾಗಿದೆ, ಇದು ನಮ್ಯತೆಯನ್ನು ಹೆಚ್ಚಿಸುತ್ತದೆ.
- ಈ ವಿಧಾನವು ನಿರ್ದಿಷ್ಟ ಪ್ರಕಾರಗಳಿಗೆ ಕಸ್ಟಮ್ ತರ್ಕವನ್ನು ನಿಭಾಯಿಸಬಹುದೇ?
- ಹೌದು, ಬಳಸುವ ಮೂಲಕ template specialization, ಅದೇ ರವಾನೆ ಚೌಕಟ್ಟನ್ನು ಬಳಸುವಾಗ ನಿರ್ದಿಷ್ಟ ಪ್ರಕಾರಗಳಿಗಾಗಿ ನೀವು ಕಸ್ಟಮ್ ನಡವಳಿಕೆಯನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಬಹುದು.
- ಸಂಕೀರ್ಣ ಟೆಂಪ್ಲೇಟ್ ದೋಷಗಳನ್ನು ನಾನು ಹೇಗೆ ಡೀಬಗ್ ಮಾಡಬಹುದು?
- ಬಳಸುವುದು concepts (ಸಿ ++ 20) ಅಥವಾ ಸ್ಥಿರ ಪ್ರತಿಪಾದನೆಗಳು ಪ್ರಕಾರಗಳನ್ನು ಮೌಲ್ಯೀಕರಿಸಲು ಸಹಾಯ ಮಾಡುತ್ತದೆ ಮತ್ತು ಸಂಕಲನ ಸಮಯದಲ್ಲಿ ಸ್ಪಷ್ಟ ದೋಷ ಸಂದೇಶಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ.
ಸಿ ++ ನಲ್ಲಿ ಟೆಂಪ್ಲೇಟ್ ರವಾನೆದಾರರನ್ನು ಸುವ್ಯವಸ್ಥಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ
ಬಹು ಟೆಂಪ್ಲೇಟ್ ಸದಸ್ಯ ಕಾರ್ಯಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ ಬಾಯ್ಲರ್ಪ್ಲೇಟ್ ಕೋಡ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡುವ ಸವಾಲನ್ನು ರವಾನೆದಾರರ ಕಾರ್ಯವನ್ನು ಬಳಸಿಕೊಂಡು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಪರಿಹರಿಸಲಾಗುತ್ತದೆ. ಪ್ರಕಾರಗಳ ಅನುಕ್ರಮಕ್ಕಾಗಿ ಕರೆಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತಗೊಳಿಸುವ ಮೂಲಕ, ಡೆವಲಪರ್ಗಳು ಕ್ಲೀನರ್ ಮತ್ತು ಹೆಚ್ಚು ನಿರ್ವಹಿಸಬಹುದಾದ ಕೋಡ್ ಅನ್ನು ಬರೆಯಬಹುದು. ಈ ವಿಧಾನವು ಸಮಯವನ್ನು ಉಳಿಸುವುದಲ್ಲದೆ ಕಾರ್ಯ ಕರೆಗಳಾದ್ಯಂತ ಸ್ಥಿರತೆಯನ್ನು ಖಾತ್ರಿಗೊಳಿಸುತ್ತದೆ.
ಂತಹ ತಂತ್ರಗಳ ಮೂಲಕ ಟೆಂಪ್ಲೇಟ್ ವಿಶೇಷತೆ. ಅನೇಕ ಪ್ರಕಾರಗಳನ್ನು ಒಳಗೊಂಡ ಸನ್ನಿವೇಶಗಳಲ್ಲಿ ಪ್ರಾಯೋಗಿಕ ಅನ್ವಯಿಕೆಗಳೊಂದಿಗೆ, ಈ ವಿಧಾನವು ಆಧುನಿಕ ಸಿ ++ ಪ್ರೋಗ್ರಾಮಿಂಗ್ನ ನಮ್ಯತೆ ಮತ್ತು ಶಕ್ತಿಯನ್ನು ತೋರಿಸುತ್ತದೆ. 🛠
ಸಿ ++ ಟೆಂಪ್ಲೇಟ್ ಕಾರ್ಯಗಳಿಗಾಗಿ ಮೂಲಗಳು ಮತ್ತು ಉಲ್ಲೇಖಗಳು
- ಸಿ ++ ಟೆಂಪ್ಲೆಟ್ ಮತ್ತು ಮೆಟಾಪ್ರೊಗ್ರಾಮಿಂಗ್ ಬಗ್ಗೆ ವಿವರಗಳನ್ನು ಅಧಿಕೃತ ಸಿ ++ ದಸ್ತಾವೇಜಿನಿಂದ ಉಲ್ಲೇಖಿಸಲಾಗಿದೆ. ಇಲ್ಲಿ ಮೂಲಕ್ಕೆ ಭೇಟಿ ನೀಡಿ: ಸಿ ++ ಉಲ್ಲೇಖ .
- ವೈವಿಧ್ಯಮಯ ಟೆಂಪ್ಲೆಟ್ಗಳು ಮತ್ತು ಪಟ್ಟು ಅಭಿವ್ಯಕ್ತಿಗಳಿಗಾಗಿ ಸುಧಾರಿತ ತಂತ್ರಗಳು ಜನಪ್ರಿಯ ಡೆವಲಪರ್ ಫೋರಂನಲ್ಲಿನ ಉದಾಹರಣೆಗಳಿಂದ ಪ್ರೇರಿತವಾಗಿವೆ: ಸ್ಟ್ಯಾಕ್ ಉಕ್ಕಿ ಹರಿಯುವುದು .
- ಶೈಕ್ಷಣಿಕ ವೇದಿಕೆಯ ವಿಷಯವನ್ನು ಬಳಸಿಕೊಂಡು ಪರಿಕಲ್ಪನೆಗಳು ಮತ್ತು ಎಸ್ಎಫ್ಐಎಎನ್ಇ ತಂತ್ರಗಳನ್ನು ಅನ್ವೇಷಿಸಲಾಗಿದೆ: ಮೈಕ್ರೋಸಾಫ್ಟ್ ಕಲಿಯಿರಿ - ಸಿ ++ .