如何不修改现有调用逻辑,绕过std::enable_if_t限制调用指定模板函数?
解决方案
实现思路
你可以给foo新增一个带默认值的布尔模板参数作为内部调用开关,配合std::disjunction组合启用条件,完全不影响现有foo的调用逻辑:
- 默认开关值为
false,此时foo仅支持int类型入参,和原有行为完全一致 - 仅在
bar内部调用时显式将开关设为true,跳过类型判定直接调用foo
完整实现代码
#include <iostream> #include <type_traits> template<typename T, bool AllowInternalCall = false, // 新增内部调用开关,默认关闭 // 启用条件:要么是内部调用,要么T是int typename = std::enable_if_t<std::disjunction_v< std::bool_constant<AllowInternalCall>, std::is_same<T, int> >>> auto foo(T t) { std::cout << t << std::endl; return t; } template<typename T> auto bar(T t) { // 内部调用时显式打开开关 foo<T, true>(t); } int main() { int i = 42; foo(i); // 原有调用完全正常,无需修改 // foo("42"); // 外部调用非int类型依然编译失败,符合需求 bar("42"); // 内部调用正常通过 return 0; }
补充说明
如果你的编译环境不支持C++17的std::disjunction,直接用逻辑或替代条件即可,效果完全一致:
typename = typename std::enable_if< AllowInternalCall || std::is_same<T, int>::value >::type
内容的提问来源于stack exchange,提问作者Alexey S. Larionov
相关产品推荐
相关产品推荐

