当前位置: 首页 > news >正文

C++SFINAE与enable_if应用

C++SFINAE与enable_if应用

SFINAE(替换失败不是错误)是C++模板元编程的核心技术,允许在模板实例化失败时选择其他重载。enable_if根据条件启用或禁用模板。

SFINAE原则:模板替换失败不会导致编译错误。

#include
#include
#include

template
typename std::enable_if::value, void>::type
process(T value) {
std::cout << "Integer: " << value * 2 << "\n";
}

template
typename std::enable_if::value, void>::type
process(T value) {
std::cout << "Float: " << value * 1.5 << "\n";
}

template
typename std::enable_if::value, void>::type
process(T value) {
std::cout << "Pointer: " << *value << "\n";
}

void sfinae_basic() {
process(42);
process(3.14);
int x = 100;
process(&x);
}

enable_if的返回类型位置。

template
auto half(T value) -> typename std::enable_if::value, T>::type {
return value / 2;
}

template
auto half(T value) -> typename std::enable_if::value, T>::type {
return value / 2.0;
}

void enable_if_return() {
std::cout << "Half int 10: " << half(10) << "\n";
std::cout << "Half double 10: " << half(10.0) << "\n";
}

enable_if在模板参数中。

template::value, int>::type = 0>
T add(T a, T b) {
return a + b;
}

void enable_if_param() {
std::cout << "add(3, 4): " << add(3, 4) << "\n";
std::cout << "add(2.5, 3.5): " << add(2.5, 3.5) << "\n";
}

检测类型是否有特定成员。

template
class has_size {
template
static auto test(int) -> decltype(std::declval().size(), std::true_type{});

template
static std::false_type test(...);

public:
static constexpr bool value = decltype(test(0))::value;
};

template
class has_iterator {
template
static auto test(int) -> decltype(std::declval().begin(), std::true_type{});

template
static 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";
std::cout << "vector has iterator: " << has_iterator>::value << "\n";
std::cout << "int has iterator: " << has_iterator::value << "\n";
}

enable_if实现类型特征。

template
struct EnableIf {};

template
struct EnableIf {
using type = T;
};

template
struct IsSame {
static constexpr bool value = false;
};

template
struct IsSame {
static constexpr bool value = true;
};

void custom_traits() {
static_assert(IsSame::value);
static_assert(!IsSame::value);
std::cout << "Custom traits work\n";
}

void conversion_type_traits() {
std::cout << "is_void_v: " << std::is_void_v << "\n";
std::cout << "is_array_v: " << std::is_array_v << "\n";
std::cout << "is_enum_v: " << std::is_enum_v << "\n";
std::cout << "is_class_v: " << std::is_class_v << "\n";
}

SFINAE can be used for tag dispatching.

template
void advanced_process(T value, std::true_type) {
std::cout << "Integer type: " << value * 2 << "\n";
}

template
void advanced_process(T value, std::false_type) {
std::cout << "Non-integer type: " << value << "\n";
}

template
void advanced_process(T value) {
advanced_process(value, std::is_integral{});
}

void tag_dispatch() {
advanced_process(42);
advanced_process(3.14);
advanced_process("hello");
}

void sfinae_with_decltype() {
auto lambda = [](auto& container) -> decltype(container[0]) {
return container[0];
};

std::vector vec = {10, 20, 30};
std::cout << "First element: " << lambda(vec) << "\n";
}

SFINAE是实现泛型类型检查和模板特化的重要技术,广泛应用于标准库实现中。

http://www.gsyq.cn/news/1552228.html

相关文章:

  • 在 Python 中,字符串切片使用语法 `s[start:stop:step]
  • 大模型深度思考能力实战评测:5个真实场景压力测试
  • 一站式跨平台影音管家:zyfun如何用技术重新定义桌面播放体验
  • 深度学习图像相似度实战:从特征嵌入到线上服务
  • 影刀RPA初学者必读:5个最常见误区与正确做法
  • Stable Diffusion生产级项目落地:从WebUI到可交付服务架构
  • AI可信四支柱:透明性、可追责性、隐私保护与无偏见性工程实践
  • Rnote:开源矢量手写笔记应用的终极指南
  • 口碑好的烘焙培训中心综合实力推荐 - myqiye
  • 豆包AI视频总结:重构视频信息处理工作流
  • 2026年南昌市PMP培训机构哪家好?官方授权R.E.P.报考指南 - 众智商学院课程中心
  • 聚焦AI时代反网络钓鱼,筑牢跨境通信安全防线——“一带一路”国家网络安全人才技能培训班成功举办
  • 专业的openclaw哪家更好
  • 漏洞修复实战指南:热修复与根治性修复的核心策略与工程实践
  • Qwen3.6Flash解析:A3B不是量化,而是动态计算调度范式
  • 中兴光猫终极解锁指南:zteOnu工具深度解析与实战应用
  • Playwright自动化测试:page.get_by_xx定位器实战指南
  • 三步掌握Electron Fiddle:桌面开发效率翻倍指南
  • 2026国内比较好的高速线切割厂家排行榜 - 品牌排行榜
  • Mermaid Live Editor:如何用代码思维彻底改变你的图表创作体验?
  • Opus 4.7企业级AI可靠性革命:自验证、字面执行与xhigh档位解析
  • 如何5分钟掌握layerdivider:智能图像分层的终极指南
  • 鲁健的Relink从实验室走向临床:一场正在进行的技术变革
  • 靠谱的无风扇工控机品牌供应商盘点 - myqiye
  • Kimi K2.5:Agent Swarm驱动的多模态智能体范式革命
  • 从emlog模板上传漏洞CNVD-2023-74536剖析文件上传安全审计方法论
  • 如何用AutoUnipus快速完成U校园网课:2025年完整自动化指南
  • 从CVE-2022-23366漏洞修复实战,详解SQL注入防御全链路策略
  • 太空天书的破译者:卫星制造翻译的技术与艺术
  • 车载信息娱乐系统(IVI)网络安全实战:从架构设计到渗透测试