[Insight-users] make compiler expand all ITK-enum cases for a template call

Bradley Lowekamp blowekamp at mail.nih.gov
Fri Aug 23 08:26:48 EDT 2013


Glad it was helpful.

C++ is a compiled language. There are compile time things such as template  and run-time things such as values, they just can't be mixed up. This is not so much a theoretical compiler issue as a practical one, that executables need to know the code they execute before hand. Scripting languages such as Python have run-time dynamic typing and are interpreted at run-time. If you are interested in this type of dynamic-runtime environment there is SimpleITK for Python and WrapITK as well.

Brad

On Aug 23, 2013, at 8:08 AM, "Dr. Roman Grothausmann" <grothausmann.roman at mh-hannover.de> wrote:

> Many thanks Brad for Your reply. I got it working with Your hints. I'll also try out SimpleITK, which seems to allow saving a lot of typing and time.
> I still wonder though why it is not possible to let the compiler resolve any possible case if enum types are used in templates.
> Is it not possible due to the theoretical compiler-logic or not (yet) included in the C++ standards or just not implement in e.g. gcc?
> 
> Thanks again for Your help
> Roman
> 
> On 22/08/13 15:13, Bradley Lowekamp wrote:
>> Hello,
>> 
>> On Aug 22, 2013, at 6:27 AM, Dr. Roman Grothausmann
>> <grothausmann.roman at mh-hannover.de> wrote:
>> 
>>> Dear mailing list members,
>>> 
>>> 
>>> Can I somehow avoid extending the two nested switch-statements (currently
>>> commented out) by a third? Since I use enumeration types (which are
>>> definitely finite) for the template argument I'd expect that the compiler
>>> should be able to resolve any possible case.
>>> 
>> 
>> Yes, you should avoid using nested switch statements. I'd suggest parsing
>> your argument in the main function, then calling a Dispatch() method with no
>> template arguments. This first method would determine the type and dimensions
>> of the first image and pass those as template parameters to Dispatch_T1<>,
>> add more template parameters for Dispatch_T2 and repeat until you achieve
>> your goal, your compiler runs out of memory or time. This way each dispatch
>> method just has one straight forward switch statement.
>> 
>> Alternatively, you could also use the typeless C++ layer that SimpleITK
>> provides.  You can do most of what you did below with just a few lines of
>> SimpleITK API. Here is a basic example[1]. You can also get more advance and
>> use SimpleITK's dispatch system to create a new SimpleITK level filter
>> composed of ITK filters, the generated SimpleITK filter code should provide
>> an idea of what would be involve.
>> 
>> Good luck, Brad
>> 
>> [1]
>> http://www.itk.org/SimpleITKDoxygen/html/SimpleGaussian_8cxx-example.html
>> 
> 
> -- 
> Dr. Roman Grothausmann
> 
> Tomographie und Digitale Bildverarbeitung
> Tomography and Digital Image Analysis
> 
> Institut für Funktionelle und Angewandte Anatomie, OE 4120
> Medizinische Hochschule Hannover
> Carl-Neuberg-Str. 1
> D-30625 Hannover
> 
> Tel. +49 511 532-9574



More information about the Insight-users mailing list