Jump to content

    

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

	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

Ну, аминь :-)

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now