LINUX.ORG.RU

Объясните про вложеные темплейты

 


1

2

https://github.com/Vectorized/Static-Sort#usage

Есть забавная библиотека, генерирующая сетку для сортировки. В примере предается размер массива, но не предается тип элементов. Никак не могу понять, как оно тип элементов определяет?

https://github.com/Vectorized/Static-Sort/blob/master/static_sort.h#L107-L111

★★★★★

Метод параметризованного класса может быть дополнительно параметризован. При этом как и для обычных параметризованных функций параметры шаблона могут выводится на основе типов аргументов.

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Но ведь если типы параметров не указаны явно, их можно вывести только в точке вызова, а не там где темплейт создали. Меня именно этот момент смущает.

Где можно про это почитать? Не знал что так можно.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Дык они и используются только в самом методе - так же как и для обычных параметризованных функций.

Почитать у Вандервуда " Шаблоны C++ Справочник разработчика." Есть в сети.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от Vit

вывести только в точке вызова

Так любая шаблонная функция или метод так инстанцируются же.

thunar ★★★★★
()
Последнее исправление: thunar (всего исправлений: 1)
Ответ на: комментарий от Vit

Вот так вот низя:

template <typename A> class C{
   T x;   
   template <typename T> void f(T x_){ x = x_; }
};

А вот так можно

template <typename A> class C{
   A y;   
   template <typename T> T f(T x){ return y*x; }
};
AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Спасиб. Я в плюсах мимокрокодил, по докам и туториалам не сразу втыкаю.

Вот так годно? Вроде собирается:

#ifndef __MEDIAN_FILTER_TEMPLATE__
#define __MEDIAN_FILTER_TEMPLATE__

#include "../../lib/static_sort.h"

template <unsigned SIZE>
class MedianFilterTemplate {

public:
    template <class T>
    inline T operator() (T *arr) const
    {
        StaticSort<SIZE> boseNelsonSort;
        boseNelsonSort(arr);

        if (SIZE & 0x1) return arr[(SIZE >> 2) + 1];
        else return (arr[SIZE >> 2] + arr[(SIZE >> 2) + 1]) / 2;
    }
};

#endif

Медианный фильтр на сетке из ссылки выше - сортируем и выдергиваем середину. Предполагается использовать так:

MedianFilterTemplate<ADC_FETCH_PER_TICK> mfilter;

uint16_t adc_voltage = mfilter(adc_voltage_buf);
uint16_t adc_current = mfilter(adc_current_buf);
Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Вот так годно?

Как минимум добавить пару static_assert, чтобы получать читаемые сообщения об ошибках, если тип не поддерживает требуемые операции(в С++20 с концептами это же можно записать короче…) (ещё можно static_assert добавить для < и всех других нужных требований типа T для вызова boseNelsonSort)

Ещё SIZE известен на этапе компиляции, так что можно использовать не runtime if, а if constexpr…

Опять же unsigned точно подходит под размер? Никогда не будет выход за 4гб, может лучше std::size_t?

https://gcc.godbolt.org/z/nKdod4

fsb4000 ★★★★★
()
Ответ на: комментарий от Vit

ХЗ, пишут что это какая то оптимизация.

Забавно, я как раз давеча быстрый медианный фильтр для D-мерного случая велосипедил. Оказывается я там сортировку Бозе-Нельсона юзал, не знал что оно так называется;-)

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от Vit

Смотрится вроде норм, хотя конечно алгоритм я в деталях не понял.

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

А мы в регуляторе скорости сползли с STM32F1 на STM32F0. Деление тю-тю, умножение только 32 бита вместо 64.

Теперь уродуюсь с алгоритмами, вспоминаю пионерское детство. А все из-за того что хочется прошивику по usb без кварца. Иначе проще F4 с плавучкой воткнуть.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

А, у вас там какие то махонькие девайсины? Да, мне проще, у меня кластер из 28ти ядерных узлов по 256Гб на каждом;-)

Но томограммы уж больно толстые а хочется их на ноутбуке обрабатывать;-(

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

АЦП подчистить от шума, дешево и сердито. Раньше было «truncated mean», но для F0 оказалось толстовато, да и подвернулся нормальный генератор сортирующей сетки.

Vit ★★★★★
() автор топика
Ответ на: комментарий от fsb4000

SIZE 4…32.

А компилятор сам разве не соптимизирут все что нужно без дополнительных указаний constexpr? Вроде пробрасывать константы уже все научились.

PS. За ссылку с примером спасибо.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

А компилятор сам разве не соптимизирут все что нужно без дополнительных указаний constexpr?

Соптимизирует.

PS. За ссылку с примером спасибо.

Вот так лучше. Я там ошибся чуток. В constexpr мы не можем использовать значение указателя, так как оно известно только в рантайме. Мы можем использовать только тип. Вот тут подправил тот пример:

https://gcc.godbolt.org/z/evGcbx

fsb4000 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.