On Thu, 5 Jan 2012, Marc Glisse wrote:

Do you have any suggestion on what libstdc++ can do when faced with C libraries that will randomly declare gets or not depending on flags? It would need knowledge of these exact flags so it can provide a replacement exactly when it isn't declared (or at least remove the using ::gets in that case, even if that is non-standard). The easiest workaround I can think of is to implement a failsafe version of using in the front-end, but there might be better solutions.

Maybe a C++03 version of some fancy template game like this?

#ifndef NOGETS
char* gets(char*){std::cout << "from libc\n";return 0;}
#endif

namespace Help1 {
        struct Toobad{};
        Toobad gets(...);
}
namespace Help2 {
        using namespace Help1;
        template<class T> struct A {
static const bool value=std::is_same<decltype(gets(std::declval<T>())),Help1::Toobad>::value && std::is_convertible<T,char*>::value;
        };
}
template<class T> typename std::enable_if<Help2::A<T>::value,char*>::type gets(T x){ std::cout << "from libstdc++, call fgets\n";return 0; }


Certainly not completely legal, but might be close enough?

--
Marc Glisse

Reply via email to