键入特征样式以测试 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;
}

是否有一些 'easy' 方法可以检查 T 是否属于 basic_string<> 类型? (如果有帮助,我确实有

我的第二个小问题是我想在 'string-like' 类型周围添加 qoutes,但是同样,是否有一些 'easy' 方法来测试这个我忽略的问题?

您可以编写自定义特征:

#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 {};

我想你可以为 'string-like' 类型编写类似的特征。 std::string_view 可能是一个不错的候选人。

你可以只使用这一行特征:

template <typename T>
inline constexpr bool is_string_type_v = std::is_convertible_v<T, std::string_view>;

它适用于几种 'string-like' 类型:

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's c++17 constructor 那里窃取了这个特性,因为可以隐式转换为 std::string_view 的类型可以被认为是 'string-like' 类型。