С++ заполнение поля класса в компил-тайме

133
11 января 2020, 07:40

Хотелось бы получить возможность заполнять байтовое поле в классе гарантировано в компил-тайме используя человекочитаемые enum'ы и структуры. Например:

myStruct one
{
    uint16_t a;
    uint8_t b;
}
class Descriptor:
{
    uint8_t fld[];
    Descriptor(myStruct one, int two, char *three);
}
Descriptor({0xEF10,0x12},2,"ABC"}) //forms 0xEF101202414243

Как это сделать? В шаблоны не передать структуры, из констекспра не вернуть константный массив.

Answer 1

Может что-то типа такого:

// Example program
#include <iostream>
#include <string>
template <int v1, int v2> class descr{
    int val1=v1;
    int val2=v2;
    public:
    void print(){
        std::cout<<std::endl<< "val1="<<val1;
        std::cout<<std::endl<< "val2="<<val2;
        }
    };

int main()
{
  descr<1,2> descr1;
  descr<2,3> descr2;
  descr1.print();
  descr2.print();
return 0;  
}

Проверялось на cpp.sh

Вывод программы:

val1=1
val2=2
val1=2
val2=3 
Answer 2

Например вот так:

#include <cstdint>
#include <cstddef>
struct myStruct
{
    uint16_t a;
    uint8_t b;
};
class Descriptor
{
    public: uint8_t fld[2 + 1 + 4 + 4];
    public: constexpr
    Descriptor
    (
        myStruct one
    ,   int two
    ,   char const ( & three )[4]
    ) noexcept
    :   fld
        {
            static_cast<uint8_t>((one.a >> 0u) bitand 0xFFu)
        ,   static_cast<uint8_t>((one.a >> 8u) bitand 0xFFu)
        ,   static_cast<uint8_t>(one.b)
        ,   static_cast<uint8_t>((two >>  0u) bitand 0xFFu)
        ,   static_cast<uint8_t>((two >>  8u) bitand 0xFFu)
        ,   static_cast<uint8_t>((two >> 16u) bitand 0xFFu)
        ,   static_cast<uint8_t>((two >> 24u) bitand 0xFFu)
        ,   static_cast<uint8_t>(three[0])
        ,   static_cast<uint8_t>(three[1])
        ,   static_cast<uint8_t>(three[2])
        ,   static_cast<uint8_t>(three[3])
        }
    {
        return;
    }
};
constexpr Descriptor desc{{0xEF10,0x12}, 2, "ABC"}; // инициализация во время компиляции
static_assert(desc.fld[0] == 0x10); // проверка корректности инициализации во время компиляции
static_assert(desc.fld[1] == 0xEF);
static_assert(desc.fld[2] == 0x12);
// ...
int main()
{
    return 0;
}

online compiler

READ ALSO
Не могу подключить libpng к проекту в VS Community 2017

Не могу подключить libpng к проекту в VS Community 2017

Никак не могу найти, как правильно установить libpng для VS community 2017Не смог установить при помощи видео с установкой для VS 2015, так как не совпадают...

94
Как QMap передать в qml и вывести в ComboBox?

Как QMap передать в qml и вывести в ComboBox?

Не понимаю как QMap <int, ThreeDModelTexture*> mapTexture; передать в qmlКласс ThreeDModelTexture у меня такой :

146
Использование стороннего компилятора clang на macOS для Qt qmake

Использование стороннего компилятора clang на macOS для Qt qmake

Мне надо собрать проект C++ QtУ меня установлен llvm-8, в pro-файле указанно

110
Как вставить массив в массив на языке С++?

Как вставить массив в массив на языке С++?

У меня есть 2 массива вида:

105