自定义is_string类型特征对字符串字面量返回意外false的原因及demangle函数正确性排查
问题2:demangle和type_of函数的引用处理问题
是的,你的type_of函数确实存在未处理引用的问题。原因是typeid(arg)会忽略引用类型:当arg是引用时,typeid返回的是被引用对象的类型信息,而非引用本身。比如:
int x = 42; int& ref_x = x; std::cout << type_of(ref_x) << '\n'; // 输出"int",而非预期的"int&"
修复方案
要保留引用类型信息,我们需要手动在类型字符串后添加&或&&(因为typeid无法提供引用类型的type_info)。修改后的代码如下:
#include <type_traits> #include <memory> #include <string> #include <cstdlib> std::string demangle(const char* mangled_name) { size_t len = 0; int status = 0; std::unique_ptr<char, decltype(&std::free)> pointer( __cxxabiv1::__cxa_demangle(mangled_name, nullptr, &len, &status), &std::free ); // 处理demangle失败的情况 if (status != 0 || !pointer) { return mangled_name; } return pointer.get(); } // 辅助模板处理不同类型的字符串拼接 template <typename T> std::string get_type_name() { return demangle(typeid(T).name()); } template <typename T> std::string get_type_name<T&>() { return get_type_name<T>() + "&"; } template <typename T> std::string get_type_name<T&&>() { return get_type_name<T>() + "&&"; } template <typename T> std::string type_of(T&& arg) { // 保留引用类型信息 return get_type_name<T>(); // 若只需底层类型,可替换为: // return get_type_name<std::remove_reference_t<T>>(); }
增强版is_string特化(覆盖更多场景)
为了确保覆盖所有字符串相关类型(包括引用),可以补充以下特化:
template <typename T> struct is_string : std::false_type {}; // 非const数组和指针 template <> struct is_string<char*> : std::true_type {}; template <> struct is_string<char[]> : std::true_type {}; template <size_t N> struct is_string<char[N]> : std::true_type {}; // const数组和指针 template <> struct is_string<const char*> : std::true_type {}; template <> struct is_string<const char[]> : std::true_type {}; template <size_t N> struct is_string<const char[N]> : std::true_type {}; // 数组引用类型 template <size_t N> struct is_string<char(&)[N]> : std::true_type {}; template <size_t N> struct is_string<const char(&)[N]> : std::true_type {}; // 辅助变量 template <typename T> constexpr bool is_string_v = is_string<T>::value;
现在is_string_v<decltype("Hello")>会正确返回true,is_string_v<decltype((hello))>(引用类型)也会返回true。
内容的提问来源于stack exchange,提问作者Desmond Gold
相关产品推荐
相关产品推荐

