用户定义的类模板参数推导指南,以推断constexpr string_view的大小

时间:2020-07-07 04:20:01

标签: c++ templates c++17 template-argument-deduction

如何编写用户定义的类模板参数推导指南以推断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的大小,以便编译代码中的注释代码行?

0 个答案:

没有答案