[vtk-developers] Alternatives to vtkTemplateMacro

Brad King brad.king at kitware.com
Thu Sep 17 16:45:02 EDT 2009


Timothy M. Shead wrote:
> Once you've defined appropriate typelists, you can use them as 
> parameters to a generic algorithm.  I imagine adding the typelist as an 
> additional parameter to Apply():
> 
>   array1->Apply<vtkNumericTypes, vtkTypedArray>(my_numeric_functor);
> 
>   array2->Apply<vtkStringTypes, vtkDenseArray>(my_string_functor);
> 
> Note that this approach is explicit and compact, while allowing the 
> caller to define their own typelist when needed.

Any approach needs to list the types that the functor
supports, essentially duplicating the overloads written
as members of the functor.  Given this functor:

   struct my_functor
   {
     template <typename T>
     void operator()(vtkTypedArray<T>&) { ... }
   };

In Tim's approach we write

   // In execute method
   array->Apply<vtkNumericTypes, vtkTypedArray>(my_functor(this));

In my approach we write something like

   // In constructor
   this->ApplyMap->Set<vtkNumericTypes, vtkTypedArray>(my_functor(this));

   // In execute method
   this->ApplyMap->ApplyTo(array)

Effectively the "extra step" Ken Moreland mentioned is
just the last line which is the same in every filter.

Actually there is no need to choose one of these methods
now.  The two approaches are not mutually exclusive.  We
could use Tim's approach for the simple/common cases and
later introduce my approach for more complicated cases.

I suggest that we use Tim's approach with a few changes:

-  Primarily I'd like to keep the Apply method template out
    of vtkArray because it is useable for other types too.
    Perhaps it can be a namespace-level function template
    (just as vtkTemplateMacro appears to be).

- The type lists could be members or traits of the functor
   types themselves:

   struct my_functor
   {
     template <typename T>
     void operator()(vtkTypedArray<T>&) { ... }

     typedef vtkTypeList<vtkNumericTypes, vtkTypedArray> types;
   };

   The Apply template can look up the type list from the
   functor it is given.

-Brad



More information about the vtk-developers mailing list