[Insight-users] no itkSetOutputMacro?

Luis Ibanez luis.ibanez at kitware.com
Sat Jan 11 10:55:51 EST 2014


Joel,


There is indeed some asymmetry between the management of Inputs and Outputs.


The itkSetInputMacro() is enabling us to use the expression:


                                          myFilter->SetRadius( 5.0 );



through  (itkMacro.h: line 719)

 719 /** Set an input. This defines the Set"name"() method */
 720 #define itkSetInputMacro(name, type)
           \
 721   virtual void Set##name(const type *_arg)
           \
 722     {
            \
 723     itkDebugMacro("setting input " #name " to " << _arg);
            \
 724     if ( _arg != static_cast< type * >(
this->ProcessObject::GetInput(#name) ) )  \
 725       {
            \
 726       this->ProcessObject::SetInput( #name, const_cast< type * >( _arg
) );       \
 727       this->Modified();
            \
 728       }
            \
 729     }


so that we don't have to write the more verbose:


                                         myFilter->SetInput( "Radius", 5.0
);



That is, the macro is there, to generate expressions that
are equivalent of what we used to have before named inputs.


For the outputs, on the other hand, ITK has:


https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Core/Common/include/itkProcessObject.h#L527

526   /** Return an output */
527   DataObject * GetOutput(const DataObjectIdentifierType & key);
528   const DataObject * GetOutput(const DataObjectIdentifierType & key)
const;


So, if a filter has a named output called "Transform", we can call


              DataObject * myFilter->GetOutput("Transform");

Note that the output type has to be the generic DataObject * , because
it must match any potential output type.


While the original method GetTransform() has a different (and more
specific) return type, such as:

              TransformType * myFilter->GetTransform();


If we were to add a

                                  itkGetOutputMacro()

It would convert:

              DataObject * myFilter->GetOutput("Transform");

into

              DataObject * myFilter->GetTransform();


but

Given that in C++, the return type is not part of the signature of a
function,
we couldn't have two methods with the same name and input parameters
but with different return types.

Namely:

              DataObject  *       myFilter->GetTransform();
              TransformType * myFilter->GetTransform();




   Regards,


         Luis




On Fri, Jan 10, 2014 at 9:50 AM, Joël Schaerer <joel.schaerer at gmail.com>wrote:

> Dear all,
>
> The addition of named inputs and outputs for ProcessObjects in ITK 4 has
> resulted in the addition of a few macros such as itkSetInputMacro which are
> responsible for exposing the new protected methods such as GetInput(name).
>
> I have found no similar macros for outputs. Why is that?
>
> Thanks!
>
> joel
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20140111/e8676563/attachment.html>


More information about the Insight-users mailing list