Уже ответили, тем не менее)
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;
}
Через 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;
}