I try to use enable_if in order to call a method or another using SFINAE, but my code does not compil since it tries to call a method with an unknown signature (the enable_if for me was here to avoid this...)
here is my code :
#include <iostream>
class A
{
public:
   bool Set1(int)
   {
      std::cout << 1 << std::endl;
      return true;
   }
   template <typename V>
   bool Set2(int, V&)
   {
      std::cout << 2 << std::endl;
      return true;
   }
};
#define DEFINE(name)\
\
template<typename T, typename V>\
struct HasTemplateMethod##name\
{\
    template<typename U, bool (U::*)(int, V&)> struct SFINAE {};\
    template<typename U> static char Test(SFINAE<U, &U::/**/name>*);\
    template<typename U> static int Test(...);\
    static const bool Has = sizeof(Test<T>(0)) == sizeof(char);\
};\
\
\
template<typename T, typename V>\
struct HasMethod##name\
{\
    template<typename U, bool (U::*)(int)> struct SFINAE {};\
    template<typename U> static char Test(SFINAE<U, &U::/**/name>*);\
    template<typename U> static int Test(...);\
    static const bool Has = sizeof(Test<T>(0)) == sizeof(char);\
    static const bool Crap = sizeof(V) == sizeof(V);\
};\
\
template<typename V>\
typename std::enable_if<HasMethod##name<A, V>::Has, bool>::type \
name(int i, V& v) \
{ \
   return this->a./**/name(i); \
}; \
 \
template<typename V>\
typename std::enable_if<HasTemplateMethod##name<A, V>::Has, bool>::type \
name(int i, V& v) \
{ \
   return this->a./**/name(i, v); \
}; \
class Call
{
   public:
   DEFINE(Set1)
   DEFINE(Set2)
   Call()
   {
      int o;
      std::cout << HasMethodSet1<A, int>::Has << std::endl;
      std::cout << HasTemplateMethodSet1<A, int>::Has << std::endl;
      std::cout << HasMethodSet2<A, int>::Has << std::endl;
      std::cout << HasTemplateMethodSet2<A, int>::Has << std::endl;
   }
   A a;
};
int main()
{
   Call c;
   int o;
// c.Set1(1, o);
// c.Set2(1, o);
}
if you comment this call :
return this->a./**/name(i); \ 
it will build and you can see the output will be 1 0 0 1 which make sense. so I don't get why the enable_if does not make his job (surely because of the template but I am stuck here).
If you wonder why I have this crap variable it was just a test to use V in the HasMethodSet2 struct.
Thanks for your help.
Aucun commentaire:
Enregistrer un commentaire