首页 > 解决方案 > 在哪里可以找到对通用 c++ 模板参数的要求?

问题描述

我尝试了解如何使用模板,例如

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

如此处所述:https ://itk.org/Doxygen/html/classitk_1_1ImageToImageFilter.html

文档似乎没有说对 TInputImage 或 TOutputImage 的限制;代码 API 也没有。似乎这两者可以是从“int”、“double”到任何类型的用户定义类的任何东西。这很奇怪。我怎么知道模板参数的要求?

标签: c++templatesitk

解决方案


实际上,文档中有关于它可能是什么的信息。它不能是 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具有上面指出的类型或 typedef。没有概念是的,因此,只有文档(或编译器)可以回答对模板类型应用了哪些限制的问题。

如果你只是想理解模板,那真的不是你应该看的库。从文档中我可以说,它是大量模板化的。

简单的例子是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,这将是编译错误。但是,您可以使用 example 实例化它std::vector<int>::iterator,因为它具有所有这些类型。


推荐阅读