如何检查一个类是否有特定的构造函数?

Ale*_*sky 2 c++ c++20

我有以下源代码:

std::string s;
std::string_view sv(s.begin(), s.end());
Run Code Online (Sandbox Code Playgroud)

它可以使用 MSVC 和 GCC 进行编译,但不能使用 Apple Clang 进行编译。

编写这样的函数的正确方法是什么

template< class It >
constexpr std::string_view make_string_view( It first, It last );
Run Code Online (Sandbox Code Playgroud)

是否可以使用 C++17 和 C++20 进行编译,并使用std::string_view接受两个迭代器的新构造函数(如果可能)?

tom*_*zmi 5

您需要在编译时检查:

  1. 迭代器是随机访问的
  2. 他们的 value_type 是std::string_view::value_type

您可以使用std::iterator_traits类、std::is_same_v类型特征和进行检查static_assert。完成此操作后,您可以计算从第一个到最后一个的距离(通过使用std::distance)并调用以下std::string_view构造函数:

constexpr basic_string_view( const CharT* s, size_type count );
Run Code Online (Sandbox Code Playgroud)

对于s,您可以传递std::addressof(*first),对于 count ,您可以传递调用的结果std::distance。