[Insight-developers] finding/using type_traits facility from C++0x?

kent williams norman-k-williams at uiowa.edu
Wed Oct 27 11:27:21 EDT 2010


Having investigated this, and looked at Tom V¹s version, I have this
implementation question:

To use the standard type_traits template metaprogramming facility, you have
to include type_traits.

Apparently in the latest Visual C++, type_traits is a standard include, and
the is_same class test is in the std:: namespace.
If you¹re using GCC 4.x.x, the header is in the tr1 subdirectory and the
is_same test is in the std::tr1:: namespace.
Any other compiler, who knows?

I added a test for type_traits in the top-level CMakeLists.txt and on OS X
it isn¹t found, because the tr1 include directory isn¹t in the system
include path.

Should I assume C++0x is too new to mess with and use my own version of the
is_same type test, or should I try and come up with a comprehensive way to
find type_traits or punt and define my own is_same test?



On 10/26/10 12:16 PM, "Bradley Lowekamp" <blowekamp at mail.nih.gov> wrote:

> Hello Kent,
> 
> This is a lot easier now that we can use partial template specialization. This
> reminds me of the common IsSameType construct (which you tried something very
> similar with a function):
> 
>  /// generic programming to test if T is the same type as U
>     template <typename T, typename U>
>     struct IsSameType {
>       /// true if T is the same type as U
>       static const bool result = false;
>     };
>     
>     
>     /// generic programming to test if T is the same type as U
>     template <typename T>
>     struct IsSameType<T,T> {
>       /// true if T is the same type as U
>       static const bool result = true;
>     };
> 
> 
> One way to address this is to define a class in the member function or as a
> member of class. I believe you can do the needed partial specialization in
> both of these scopes. Then just add a member function to the above construct
> that is specific to that specialization.
> 
> This is what I would try... not 100% it'll work though.
> 
> Good luck,
> Brad
> 
> On Oct 26, 2010, at 12:36 PM, kent williams wrote:
> 
>> I'm trying to fix this bug:
>> http://public.kitware.com/Bug/view.php?id=3610
>> 
>> the problem is this code:
>> 
>>   typename TFeatureImageType::Pointer tempFeature;
>>   if ( typeid(TImageType) == typeid(TFeatureImageType))
>>     {
>>     m_Canny->SetInput(tempFeature);
>>     }
>>   else
>>     {
>>     m_Caster->SetInput(tempFeature);
>>     m_Canny->SetInput(m_Caster->GetOutput());
>>     }
>> 
>> This code breaks if typeid(TImageType) != typeid(TFeatureImageType), since
>> the compiler still compiles the top branch of the if statement, and the
>> m_Canny->SetInput() call will be in error because of incorrect parameter
>> type.
>> 
>> I thought I could fix this with specialization, like this:
>>> // IN CLASS DEFINITION
>>> template <class _TImageType, class _TFeatureImageType>
>>> void AssignCannyInput(typename _TFeatureImageType::Pointer &input)
>>> {
>>>   m_Caster->SetInput(input);
>>>   m_Canny->SetInput(m_Caster->GetOutput());
>>> }
>>> template <>
>>> void AssignCannyInput<TImageType,TImageType>(typename TImageType::Pointer
>>> &input)
>>> {
>>>   m_Canny->SetInput(input);
>>> }
>> 
>> But the compiler objects to the specialization inside the class definition,
>> and moving the specialization out of the class like this:
>> 
>>> // Removed from class definition, moved to TXX file
>>> template< class TImageType, class TFeatureImageType >
>>> template <>
>>> void
>>> CannySegmentationLevelSetFunction< TImageType, TFeatureImageType >
>>> ::AssignCannyInput<TImageType,TImageType>
>>> (typename TImageType::Pointer &input)
>>> {
>>>   m_Canny->SetInput(input);
>>> }
>> 
>> Is illegal as well.
>> 
>> Does anyone know of a good Template MetaProgramming solution to this issue?
>> <ATT00001..txt>
> 
> ========================================================
> 
> Bradley Lowekamp 
> 
> Lockheed Martin Contractor for
> 
> Office of High Performance Computing and Communications
> 
> National Library of Medicine
> 
> blowekamp at mail.nih.gov
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/mailman/private/insight-developers/attachments/20101027/fe8ad014/attachment.htm>


More information about the Insight-developers mailing list