Задать вопрос
@Mercury13
Программист на «си с крестами» и не только

Как избавиться от явного задания типа в вариативном шаблоне (двухмерный массив, инициализируемый строчками)?

Задача: получить вычисляемые при компиляции массивы, в которых не может быть ни больше, ни меньше инициализаторов.

У меня получилось на макросах, и почти получилось на настоящем Си++. Но камнем преткновения стали двухмерные массивы, инициализируемые строчками по 4 символа.

#include <iostream>
#include <array>

#define consteval constexpr

using Char5 = std::array<char, 5>;

template <size_t N>
class CArray5
{
public:
    using CppArray = const std::array<Char5, N>;
    constexpr size_t size() const { return N; }

    template <class ... Args>
    consteval CArray5(Args ... x)
        : fBuf { x... }
    {
        static_assert(sizeof...(Args) == N, "CArray size mismatch");
    }
private:
    CppArray fBuf;
};


namespace {
    CArray5<3> names { Char5{"alph"}, Char5{"brav"}, Char5{"char"} };
    // Как избавиться от этих преобразований Char5{...}  ???????
}


int main()
{
    std::cout << names.size() << std::endl;
    return 0;
}
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 1
@Mercury13 Автор вопроса
Программист на «си с крестами» и не только
#include <iostream>
#include <array>

#define consteval constexpr

class Char4
{
public:
    using Array = char[5];
    using CppArray = std::array<char, 5>;
    consteval Char4(const char (&x)[5]) : fData { x[0], x[1], x[2], x[3] } {}
    constexpr std::string_view toSv() const { return { fData.asAr, 4 }; }
private:
    union Ch {
        struct asInts {
            char a, b, c, d;
        };
        char asAr[4];
    } fData;
};

template <size_t N>
class CArray4
{
public:
    using CppArray = const std::array<Char4, N>;
    constexpr size_t size() const { return N; }
    const Char4& operator [] (size_t i) const { return fBuf[i]; }

    template <class ... Args>
    consteval CArray4(Args&& ... x)
        : fBuf { x... }
    {
        static_assert(sizeof...(Args) == N, "CArray size mismatch");
    }
private:
    CppArray fBuf;
};


namespace {
    CArray4<3> names { "alph", "brav", "char" };
}


int main()
{
    std::cout << names.size() << std::endl;
    std::cout << names[2].toSv() << std::endl;
    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы