Re: строковый литерал в шаблон?
От: Sm0ke Россия ksi
Дата: 06.09.23 15:48
Оценка: 77 (2)
Уже ответили, тем не менее)

Вариант 1


link: https://godbolt.org/z/j3M39odM6
#include <iostream>
#include <utility>

template <typename T, std::size_t N>
struct static_text
{
  T data[N];

  constexpr static_text(T (&s)[N]) : static_text(s, std::make_index_sequence<N>{}) {}
  
  template <std::size_t ... I>
  constexpr static_text(T (&s)[N], std::index_sequence<I ...>) : data{s[I] ...} {}
};

template <static_text S>
struct TAG
{};

//

int main()
{
    static_assert(std::is_same_v< TAG<"123">, TAG<"123"> >);
    return 0;
}


Вариант 2


Через std::array ~ https://godbolt.org/z/3hs7v4Y7d
#include <iostream>
#include <array>
#include <utility>

struct to_array_t {
  template <typename T, std::size_t N, std::size_t ... I>
  static inline constexpr std::array<T, N> helper(T (&s)[N], std::index_sequence<I ...>)
  { return {s[I] ...}; }
};

constexpr to_array_t to_array{};

template <typename T, std::size_t N>
constexpr std::array<T, N> operator * (T (&s)[N], to_array_t)
{ return to_array_t::helper(s, std::make_index_sequence<N>{});  }

//

template <std::array S>
struct TAG_ARRAY
{};

//

int main()
{
    static_assert(std::is_same_v< TAG_ARRAY<"123"*to_array>, TAG_ARRAY<"123"*to_array> >);
    return 0;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.