C++SFINAE技术详解

发布时间:2026/5/22 5:38:33

C++SFINAE技术详解 CSFINAE技术详解SFINAESubstitution Failure Is Not An Error是C模板元编程的核心技术允许在模板实例化失败时不产生编译错误而是尝试其他重载。SFINAE的基本原理是模板替换失败不是错误。#include#includetemplatetypename std::enable_if::value, T::typeprocess(T value) {std::cout Processing integer: value \n;return value * 2;}templatetypename std::enable_if::value, T::typeprocess(T value) {std::cout Processing float: value \n;return value * 1.5;}void sfinae_basic() {process(42);process(3.14);}enable_if根据条件启用或禁用模板。templatetypename std::enable_if::value::typeprint(T ptr) {std::cout Pointer: *ptr \n;}templatetypename std::enable_if::value::typeprint(T value) {std::cout Value: value \n;}void enable_if_example() {int x 42;print(x);print(x);}SFINAE可以检测类型是否有特定成员。templateclass has_size {templatestatic auto test(int) - decltype(std::declval().size(), std::true_type{});templatestatic std::false_type test(...);public:static constexpr bool value decltype(test(0))::value;};void member_detection() {std::cout vector has size: has_size::value \n;std::cout int has size: has_size::value \n;}返回类型SFINAE控制函数的可用性。templateauto get_value(T container) - decltype(container[0]) {return container[0];}void return_type_sfinae() {std::vector vec {1, 2, 3};std::cout First element: get_value(vec) \n;}表达式SFINAE检测表达式的有效性。templateauto add(T a, U b) - decltype(a b) {return a b;}void expression_sfinae() {std::cout Int double: add(10, 3.14) \n;}SFINAE可以实现类型特征。templatestruct is_container {templatestatic auto test(int) - decltype(std::declval().begin(),std::declval().end(),std::true_type{});templatestatic std::false_type test(...);static constexpr bool value decltype(test(0))::value;};C17的if constexpr简化了某些SFINAE用例。templateauto process_v2(T value) {if constexpr (std::is_integral_v) {return value * 2;} else if constexpr (std::is_floating_point_v) {return value * 1.5;} else {return value;}}SFINAE是模板元编程的基础技术理解它对于编写高级泛型代码至关重要。

相关新闻