当前位置: 首页 > 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.jsqmd.com/news/1040322/

相关文章:

  • 在 Python 中,字符串切片使用语法 `s[start:stop:step]
  • 大模型深度思考能力实战评测:5个真实场景压力测试
  • 一站式跨平台影音管家:zyfun如何用技术重新定义桌面播放体验
  • 阿里ATH事业群与Token计费:重构AI商业化底层逻辑
  • 从零搭建稳定Selenium自动化测试环境:Python+pytest+webdriver-manager实战指南
  • PeakRoutine 新手入门与实战指南
  • 深度学习图像相似度实战:从特征嵌入到线上服务
  • Gemma-4B真实参数量揭秘:Hybrid Attention与PLE如何定义端侧有效参数
  • 影刀RPA初学者必读:5个最常见误区与正确做法
  • 飞思卡尔MSC8101 DSP农场卡硬件架构解析与初始化实战指南
  • Claude上下文优化三法则:Skills懒加载、Explore子代理与路径规则
  • Generative Ops:生成式运营的原理、能力与落地实践
  • Stable Diffusion生产级项目落地:从WebUI到可交付服务架构
  • DeepSeek-V4成本真相:技术细节如何决定真实价格
  • UVa 526 String Distance and Transform Process
  • 深入解析MMDS11总线状态分析:嵌入式调试核心机制与实战命令
  • SoapUI:API测试瑞士军刀,从功能到性能的全栈实战指南
  • 2026年知名的膜结构工程品牌制造商用户力荐 - myqiye
  • 免费跨平台视频聚合播放器:zyfun如何用Electron+Vue3打造终极观影体验
  • 预测性线索评分:B2B销售精准决策的实战引擎
  • MCP1525与MCP1541电压基准芯片:选型、电路设计与高频问题排查指南
  • 便携式Kali与AI自动化渗透测试:构建智能安全测试平台
  • M2.7自我深度迭代:大模型在线认知闭环技术解析
  • AI可信四支柱:透明性、可追责性、隐私保护与无偏见性工程实践
  • Agent之Skill:SkillSpector的简介、安装和使用方法、案例应用之详细攻略
  • 嵌入式开发中链接器参数文件(PRM)的内存配置与优化实践
  • 从月销3万+看中国品牌出海:如何把“不起眼”的工具变成海外刚需?
  • Rnote:开源矢量手写笔记应用的终极指南
  • 物流调度实时监控HTML大屏模板(含登录页+ECharts动态图表)
  • 口碑好的烘焙培训中心综合实力推荐 - myqiye