[C++-sig] Re: args patch

David Abrahams dave at boost-consulting.com
Sat Aug 2 18:01:55 CEST 2003


Aleksey Gurtovoy <agurtovoy at meta-comm.com> writes:

>> I think msvc_is_incomplete<T>::value would always be true.
>
> Yeah. Unfortunately, that's the only way I know to implement 'has_xxx' on
> MSVC so that it doesn't bark on incomplete types, and there is some code
> around which relies on it. On the other hand, Boost.Python probably doesn't
> depend on it, and since '/vmg' is not the default option, what we _can_ do
> is to guard the 'is_incomplete' check with something like
> BOOST_MPL_AUX_HAS_XXX_MSVC_NO_IS_INCOMPLETE and ask to define the symbol
> when compiling with '/vmg' or '#pragma pointers_to_members(full_generality,
> ...)'.
>
> If that sounds like a reasonable compromise - in particular, to Nikolay -
> please feel free to implement it.

I did you one better.  Now it just works with no
BOOST_MPL_AUX_HAS_XXX_MSVC_NO_IS_INCOMPLETE switches required from
the user:

--- has_xxx.hpp	8 Jul 2003 05:10:02 -0000	1.16
+++ has_xxx.hpp	2 Aug 2003 15:58:44 -0000	1.17
@@ -3,8 +3,8 @@
 // See http://www.boost.org for updates, documentation, and revision history.
 //-----------------------------------------------------------------------------
 //
-// Copyright (c) 2002
-// Aleksey Gurtovoy
+// Copyright (c) 2002-2003
+// Aleksey Gurtovoy and David Abrahams
 //
 // Permission to use, copy, modify, distribute and sell this software
 // and its documentation for any purpose is hereby granted without fee, 
@@ -73,10 +73,14 @@
 template< typename T >
 struct msvc_is_incomplete
 {
-    struct incomplete_;
-    BOOST_STATIC_CONSTANT(bool, value = 
-          sizeof(void (T::*)()) == sizeof(void (incomplete_::*)())
-        );
+    // MSVC is capable of some kinds of SFINAE.  If U is an incomplete
+    // type, it won't pick the second overload
+    static char tester(...);
+    template <class U>
+    static char(& tester(type_wrapper<U>) )[sizeof(U) + 1];
+    
+    BOOST_STATIC_CONSTANT(
+        bool, value = sizeof(tester(type_wrapper<T>())) == 1);
 };

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com





More information about the Cplusplus-sig mailing list