键入特征样式以测试 T 是basic_string<>还是可打印的类似字符串的类型?
Type traits style to test if T is a basic_string<> or printable string-like type?
我正在编写一个可以使用 ostream 的模板打印范围:
template<class T>
struct range_out {
range_out(T& range) : r_(range) {
}
T& r_;
//static_assert(std::is_same<T::); //check that T is not std::string (std::string, etc. should just use << operator directly instead)
};
template <typename T>
std::ostream& operator<< (std::ostream& out, range_out<T>& range) {
constexpr std::string_view sep{ std::is_arithmetic<T>::value ? ", " : "', '" }; //<<-- better way to check for string-like type ?
if (!range.r_.empty()) {
out << '[';
for (auto& e : range.r_) {
out << e << sep;
}
out << std::string(sep.size(), 'b') << "]";
}
return out;
}
有没有一些"简单"的方法来检查T是否属于basic_string<>类型?(如果有帮助的话,我确实有提升(
我的第二个小问题是我想在"类似字符串"的类型周围添加 qoutes,但同样,是否有一些"简单"的方法来测试这个 im 忽略?
您可以编写自定义特征:
#include <string>
#include <type_traits>
template
<
typename x_MaybeString
> struct
is_basic_string: public ::std::false_type {};
template
<
typename x_Char
, typename x_Traits
, typename x_Allocator
> struct
is_basic_string<::std::basic_string<x_Char, x_Traits, x_Allocator>>: public ::std::true_type {};
我想你可以为"字符串状"类型编写类似的特征。std::string_view
可能是一个很好的候选人。
你可以只使用这个行特征:
template <typename T>
inline constexpr bool is_string_type_v = std::is_convertible_v<T, std::string_view>;
它适用于几种"类似字符串"的类型:
static_assert(is_string_type_v<std::string>);
static_assert(is_string_type_v<std::string_view>);
static_assert(is_string_type_v<const char*>);
static_assert(is_string_type_v<char*>);
static_assert(is_string_type_v<char* const>);
static_assert(is_string_type_v<const char* const>);
static_assert(is_string_type_v<char (&)[5]>);
static_assert(is_string_type_v<const char (&)[5]>);
我从std::string
的 c++17 构造函数中窃取了这个特征,因为可以隐式转换为std::string_view
的类型可以被视为"类字符串"类型。
相关文章:
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 使用即将推出的C++反射工具打印类型的全名
- 为自定义打印调试实现传递任何类型的变量
- 将char类型指定给int以打印相应的ASCII字符
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 键入特征样式以测试 T 是basic_string<>还是可打印的类似字符串的类型?
- 如何打印出十进制(tagDEC)类型的值?
- 如何在实例化类类型的变量时打印其名称
- 类类型向量的打印内容
- 如何使用谷歌测试打印标准::时间类型
- UINTX_T和INTX_T类型的打印保证
- 如何使用 std::copy 打印用户定义的类型
- GDB有没有办法在不省略模板参数的情况下打印类型
- 如何打印类型向量<元组<字符串、int、int>> 以筛选 c++?
- c++中基类指针引用的对象的打印类型
- 打印类型包括装饰,模板元编程,constexpr,使用什么
- 模板元编程:打印类型列表
- 漂亮打印类型和类模板及其所有模板参数