C++如何为函数/lambda指针参数设置nullptr/NULL默认值
报错根因
你的写法不符合C++模板推导规则:模板参数无法通过函数参数的默认值完成推导,当你不传入fSqrt参数时,编译器无法确定TypeFunc的具体类型,因此匹配失败。
符合要求的实现方案
方案1(C++11及以上兼容,推荐)
直接给模板参数TypeFunc设置默认类型,搭配默认实参即可,该方案仅会根据TypeData的类型生成不同模板实例,不会影响函数内部的static变量逻辑,也不需要重载:
#include <cmath> // 给TypeFunc设置默认类型为 接收TypeData参数、返回TypeData的函数指针 template<class TypeData, typename TypeFunc = TypeData(*)(TypeData)> bool isPrime(const TypeData& n, TypeFunc fSqrt = static_cast<TypeData(*)(TypeData)>(std::sqrt), bool debug = false) { // 你的原有函数实现,无需修改内部逻辑 }
该实现支持你需要的所有调用方式:
isPrime(n):使用默认的标准库平方根函数isPrime(n, customSqrt):使用自定义的开方函数isPrime(n, customSqrt, true):同时传入自定义开方函数和debug开关
方案2(自定义默认开方逻辑用)
如果你不希望默认使用标准库的std::sqrt,想自己实现默认的开方逻辑,可以将TypeFunc的默认类型设为std::nullptr_t,内部判断空指针走默认逻辑:
#include <cstddef> #include <type_traits> #include <cmath> template<class TypeData, typename TypeFunc = std::nullptr_t> bool isPrime(const TypeData& n, TypeFunc fSqrt = nullptr, bool debug = false) { TypeData sqrt_n; if constexpr (std::is_same<TypeFunc, std::nullptr_t>::value) { // 这里写你自定义的默认开方逻辑 sqrt_n = std::sqrt(n); } else { sqrt_n = fSqrt(n); } // 剩余原有逻辑,static变量正常使用 }
方案3(C++20及以上)
如果可以使用C++20标准,可用std::invocable约束做类型校验,写法更严谨:
#include <cmath> #include <concepts> template<class TypeData, std::invocable<TypeData> TypeFunc = decltype(static_cast<TypeData(*)(TypeData)>(std::sqrt))> bool isPrime(const TypeData& n, TypeFunc fSqrt = static_cast<TypeData(*)(TypeData)>(std::sqrt), bool debug = false) { // 原有实现 }
内容的提问来源于stack exchange,提问作者Supreeto
相关产品推荐
相关产品推荐

