如何编写用户定义的类模板参数推导指南以推断constexpr std::string_view
的大小?
我想实现一个固定长度的可变String
。在C ++ 17类模板实参推导(CTAD)技术的帮助下,此String
的用户在初始化N
时可以跳过将大小String
指定为模板实参来自字符串文字。
现在,如果用户从constexpr String
初始化std::string_view
,我想启用相同的省略。但是我不知道如何为这种情况编写类模板参数推导指南。
下面用g++ -std=c++17
编译的最小代码说明了我的情况
#include <cstddef>
#include <cstring>
#include <iostream>
#include <string>
#include <string_view>
template<std::size_t N>
struct String
{
char carr[N] {};
String(const char * cstr)
{
std::memcpy(carr, cstr, N);
}
String(const std::string_view & sv)
{
std::memcpy(carr, sv.data(), N);
}
constexpr std::size_t size() const
{
return N;
}
};
// user-defined class template argument deduction guide for string literal
template<std::size_t N> String(const char (&)[N]) -> String<N-1>;
int main()
{
String s1("hello");
static_assert(s1.size() == 5);
constexpr std::string_view sv("view");
String<4> s2(sv);
static_assert(s2.size() == 4);
// Question: How to write class template argument deduction guide
// so that the following lines would compile?
// String s3(sv);
// static_assert(s3.size() == 4);
return 0;
}
问题:如何编写类模板参数推导指南来推断constexpr string_view
的大小,以便编译代码中的注释代码行?