Jump to content

    
Sign in to follow this  
ViKo

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

Recommended Posts

	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.

Share this post


Link to post
Share on other sites

Сделал.

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

	}

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 час назад, ViKo сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

template<typename A_T>
class BitBand
{

}

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
23 минуты назад, ViKo сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this