Переопределить параметр шаблона - PullRequest
3 голосов
/ 30 июня 2019

Я работаю над шаблоном C ++ HAL (Hardware Abstraction Library).Я пытаюсь создать абстракцию регистра, которая принимает адрес регистра как параметр шаблона как uint32_t или как указатель, но я не знаю, как это сделать, потому что это вызывает перегрузку параметра шаблона.

Неверный пример, вызывающий redeclareошибка параметра:

template<uint32_t addr>
struct reg
{
   ...
};

template<uint32_t* addr>
struct reg
{
   ...
};

Я думал о специализации шаблона:

template<class T> 
struct reg {};

template<>
struct reg<uint32_t>
{
   ...
};

template<>
struct reg<uint32_t*>
{
   ...
};

Но я не могу получить фактическое значение адреса таким образом.

Есть ли способсделать это?

1 Ответ

3 голосов
/ 30 июня 2019

Вы близки, параметр шаблона auto решает это аккуратно:

template <auto addr>
struct reg;

template <std::uintptr_t addr>
struct reg<addr> { /* ... */ };

template <auto *addr>
struct reg<addr> { /* ... */ };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...