Где найти требования к параметрам общего шаблона C ++? - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь понять, как использовать шаблон, например

itk::ImageToImageFilter< TInputImage, TOutputImage > Class Template Reference

, как указано здесь: https://itk.org/Doxygen/html/classitk_1_1ImageToImageFilter.html

В документе, похоже, не говорится ограничение на TInputImage или TOutputImage; как и API кода. Кажется, что они могут быть чем угодно, от «int», «double» до любых пользовательских классов. Это странно. Как узнать требования к параметрам шаблона?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

itk::ImageToImageFilter - абстрактный базовый класс для фильтров изображений (вычисления, которые работают с изображениями и создают изображения в качестве выходных данных). Он предназначен для использования с itk::Image в качестве входа и выхода. Большинство конкретных фильтров дают некоторые ограничения на возможные варианты типов входных и выходных шаблонов (размерность, тип пикселя с плавающей запятой или интеграл и т. Д. c).

Как правило, если вы хотите узнать, как использовать библиотеку чтение его документации является хорошей отправной точкой.

1 голос
/ 30 апреля 2020

На самом деле в документации есть информация о том, что это может быть. И это не может быть int, double или что-то еще.

using   InputImageConstPointer = typename InputImageType::ConstPointer

using   InputImagePixelType = typename InputImageType::PixelType

using   InputImagePointer = typename InputImageType::Pointer

using   InputImageRegionType = typename InputImageType::RegionType

using   InputImageType = TInputImage

Таким образом, TInputImage должно иметь как минимум несколько типов. То же самое для TOutputImage.

Компилятор проверит, что TInputImage имеет типы или typedefs, которые указаны выше. Понятий нет, да, так что только документация (или компилятор) может ответить на вопрос, какие ограничения применяются к шаблонному типу.

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

Простым примером будет std :: iterator_traits . Он имеет

Member types
Member type Definition
difference_type Iter::difference_type
value_type  Iter::value_type
pointer Iter::pointer
reference   Iter::reference
iterator_category   Iter::iterator_category

Вы не можете создать экземпляр iterator_traits с типом, который не имеет difference_type, value_type, pointer, reference, iterator_category, это будет ошибка компиляции. Однако вы можете создать его, например, с помощью std::vector<int>::iterator, потому что он имеет все эти типы.

...