c++ - 输入特征样式来测试 T 是否是 basic_string<> 或可打印的类似字符串类型?

标签 c++ templates c++17 type-traits

我正在写一个可以使用 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,但同样,是否有一些“简单”的方法来测试这个我忽略的问题?

最佳答案

您可以编写自定义特征:

#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 可能是一个不错的候选者。

关于c++ - 输入特征样式来测试 T 是否是 basic_string<> 或可打印的类似字符串类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57587666/

相关文章:

c++ - 类包装器的模板特化

C++:使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的

c++ - 在 C++ 中初始化类变量 float 数组

html - 给定 URL,如何找到网站的 "main"图片?

c++ - C++ 中成员数量可变的模板类

c++ - 在 C++20 获得批准之前,我应该如何处理时代以来的值?

c++ - 静态类成员不是与 this 指针没有关联吗?

c++将char数组传递给函数并更改它

c++ - 如何在 C++ 中使用 Sobol 序列生成分布良好的正态分布?

c++ - 在编译时查找基类