Перейти к содержанию
    

Нетиповой вариативный шаблон класса. Помогите написать.

	template <bool ... rp>
	static void reset() {
		getGpio()->BSRR = (... | (rp << (uint(PN.bitn) + 16)));
	}

	template <bool ... sp>
	static void set() {
		getGpio()->BSRR = (... | (sp << uint(PN.bitn)));
	}

Это компилируется, как надо.

	template <bool ... rp, bool ... sp>
	static void res_set() {
		getGpio()->BSRR = ((rp << (uint(PN.bitn) + 16)) | ...) |
						  ((sp << uint(PN.bitn)) | ...);
	}

Это даёт ошибку. Не различает параметры rp и sp. Они же подряд записаны при создании функции. Как побороть?

Наверное, надо задать для каждого пина состояние 0 или 1, и кидать единицы в нужную часть регистра BSRR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал.

	template <bool ... st>
	static void res_set() {
		getGpio()->BSRR = (... | (1 << (uint(PN.bitn) + !st * 16)));

	}

Предыдущие две функции выкину, чтобы не путали.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Типа, написал. Объединил полный порт и частичный в один класс. Есть функции для работы с полным портом, есть с частью по маске. От конструктора отказался, конфигурирую ноги функцией.
Прикол, в проверочной программе остался вызов конструктора Port(); Так на него компилятор даже не заикнулся. Видимо, подразумевается пустой конструктор по умолчанию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, аминь :-)

А конструктор всегда есть, даже если не объявлен. По умолчанию он тривиальный просто.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще мелкий вопросик всплыл. Шаблон нужно размещать в заголовочном файле hpp. Но тогда надо лазить по всему определению класса, чтобы найти, какие функции у него есть. Как тут делать? Класс описать в начале файла hpp, где показать только объявления функций, а открытые функции отдельно дальше определять в том же файле? И закрытые функции также отдельно определять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, ViKo сказал:

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

Да, можно так. Тогда интерфейс класса будет виден яснее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу переписать bit-band манипуляции в виде шаблона класса. Наткнулся на такое.
http://micro-os-plus.sourceforge.net/doc/BitBand_8h_source.html

Вопрос. Почему шаблон задан не перед названием класса, а перед его функциями? Он же одинаковый. Это что-то меняет, улучшает? Почему так не сделали:

template<typename A_T>
class BitBand
{

}

И непонятно, почему они адрес переменной задали в виде параметра шаблона, а номер бита постеснялись. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то я туплю. Адрес переменной - это константа? То есть, могу ли я в шаблоне задать параметр - адрес переменной? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 минуты назад, ViKo сказал:

Адрес переменной - это константа?

Да. Он не меняется в течении всего времени выполнения программы.

23 минуты назад, ViKo сказал:

То есть, могу ли я в шаблоне задать параметр - адрес переменной? 

Увы, нет. Потому что при следующем запуске в "больших" машинах программа может быть загружена в другое место и адрес переменной будет другим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...