模板函数中如何用constexpr匹配不同长度的wchar_t数组
解决方案
你现有的std::is_convertible_v<Arg, const wchar_t*>逻辑理论上可以匹配wchar_t数组类型,因为数组可以隐式退化为指针。如果发现没有命中,首先检查你原有代码的分支是否漏写了return(你给出的示例代码中两个分支调用转换函数后没有返回值,会导致编译错误)。
如果你需要显式精准匹配任意长度的wchar_t数组,避免其他可转为const wchar_t*的非数组类型误匹配,可以新增专门的数组判断分支,放在指针判断之前即可:
#include <type_traits> #include <string> // 假设你已实现对应的转换函数 std::string jqWideChar2StlString(const wchar_t* str); std::string jqWideChar2StlString(const std::wstring& str); template <const char delim = ' ', typename Arg> inline std::string jq2StlString(const Arg& arg) { if constexpr (std::is_same_v<Arg, std::wstring>) { return jqWideChar2StlString(arg); } // 新增分支:匹配任意长度的wchar_t数组,包括带cv限定的const wchar_t[N] else if constexpr (std::is_array_v<Arg> && std::is_same_v<std::remove_cv_t<std::remove_extent_t<Arg>>, wchar_t>) { return jqWideChar2StlString(arg); } else if constexpr (std::is_convertible_v<Arg, const wchar_t*>) { return jqWideChar2StlString(arg); } // 原有其他逻辑... }
判断逻辑说明
std::is_array_v<Arg>先校验传入类型是否为数组std::remove_extent_t<Arg>去除数组的维度,拿到数组元素的基础类型std::remove_cv_t剔除元素类型的const、volatile修饰,兼容const wchar_t[N]这类带限定符的数组
该分支可以命中任意长度的wchar_t[N]、const wchar_t[N]类型,不需要预先知道数组长度。
内容的提问来源于stack exchange,提问作者tonyc
相关产品推荐
相关产品推荐

