Boost logo

Boost :

Subject: Re: [boost] Class-level instrospection
From: Olivier Grant (olivier.grant_at_[hidden])
Date: 2008-10-24 12:22:57


Hi,
It compiles fine but the result is wrong if the member type is not POD.
Forcing the resolution to use the "test( ... )" nested function yields the
following
compiler error :

test.cpp(23) : error C2770: invalid explicit template argument(s) for
'has_type_to_test<T>::yes
has_type_to_test<T>::test(has_type_to_test<T>::Helper<U,&U::value> *)'

Here is the test code that I ran, simplifying your code to try and track
down the pb:

#include <iostream>

/*
 * under VC7.1, if type_to_test is not a POD, the output
 * will be "false", else it will be "true".
 *
 * If the test( ... ) is commented out to force use of the
 * test( Helper<U, &U::value> * ) resolution, the VC7.1 will output
 * the following error message:
 *
 * test.cpp(23) : error C2770: invalid explicit template argument(s) for
 * 'has_type_to_test<T>::yes
has_type_to_test<T>::test(has_type_to_test<T>::Helper<U,&U::value> *)'
 */

#if 0 // Changing this to 1 will yield a wrong output.
class type_to_test { };
#else
typedef int type_to_test;
#endif

/**
 * introspection
 */
template< typename T >
struct has_type_to_test
{
private:
typedef char no;
typedef struct { no _[2]; } yes;
 template< typename U, type_to_test U::* > struct Helper;
 template< typename U > static yes test( Helper<U, &U::value> * );
template< typename U > static no test( ... );

public:
static bool const result = (sizeof(yes) == sizeof(test<T>(0)));
};

/**
 * dummy test structure.
 */
struct test_structure
{
    type_to_test value;
};

/**
 * main prog.
 */
int main( )
{
    std::cout << "has_type_to_test<test_structure>::result == "
              << std::boolalpha << has_type_to_test<test_structure>::result
              << "\n";

std::getchar();

    return 0;
}

This codes compiles fine under gcc 4.x.x and yields the correct result as
well.

Don't hesitate if you have any other questions,

Regards,

Olivier.

On Fri, Oct 24, 2008 at 6:06 PM, Joel Falcou <joel.falcou_at_[hidden]> wrote:

> Olivier Grant a écrit :
>
>> Hi,
>> I was playing around with the introspection lib and it doesn't seem to
>> work
>> for public members that are not of POD type with Visual 7.1
>>
>> Any idea how to work around that ?
>>
>> Thanks,
>>
>> Olivier.
>>
>
> Thanks for reporting. THose were predictable so i'll take extra-care
> at solvign those. I don't have access to VC7.1, only to VC8.
> Does it fail to compile or does it returns incorrec results ?
> If the former, care to post error messages ?
> If the later, care to post a code I can compile on VC ?
>
> Thanks in advance
>
> _______________________________________________
> Unsubscribe & other changes:
> http://lists.boost.org/mailman/listinfo.cgi/boost
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk