Добавить поддержку преобразования целого числа в указатель на этапе компиляции

lamer0k
lamer0k

Например, регистры:

Мы знаем по каким адресам находятся, но чтобы в них что-то записать или прочитать, мне нужно преобрзовать этот адресс к указателю, а затем разименовать укзатель. Получается вот так сделать нельзя:

#include <cstddef>

struct Register
{ 
  constexpr Register(size_t addr): reg(*reinterpret_cast<volatile size_t*>(addr)) //! Error here
  {
  }

  void Write(size_t data) const
  {
    reg = data ;
  }    
  
private:
  volatile size_t& reg ;
} ;

//size_t IDR = *reinterpret_cast<size_t*>(0x00010U) ;

constexpr Register reg(0x00010U) ; 

int main()
{
  reg.Write(10) ;
}

При этом вот так можно:

#include <cstddef>

struct Register
{ 
  constexpr Register(volatile size_t& addr): reg(addr)
  {
  }

  void Write(size_t data) const
  {
    reg = data ;
  }    
  
private:
  volatile size_t &reg ;
} ;

size_t IDR = *reinterpret_cast<volatile size_t*>(0x00010U) ;
//constexpr size_t IDR = *reinterpret_cast<volatile size_t*>(0x00010U) ; //!error

constexpr Register reg(IDR) ; 

int main()
{
  reg.Write(10) ;
}

Было бы замечатедьно, если бы можно было бы сделать как то так:

#include <cstddef>

struct Register
{ 
  constexpr Register(size_t addr): reg(*pointer_cast<volatile size_t*>(addr)
  {
  }

  void Write(size_t data) const
  {
    reg = data ;
  }    
  
private:
  volatile size_t &reg ;
} ;

constexpr Register reg(0x00100) ; 

int main()
{
  reg.Write(10) ;
}
-1
рейтинг
C++20
2 комментария
yndx-antoshkka

Для этого в C++20 можно использовать std::bit_cast

yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения