Я пытаюсь использовать SFINAE, чтобы обнаружить, если класс имеет перегруженную функцию членства, которая берет определенный тип. Код, который я имею, кажется, работает правильно в Visual Studio и GCC, но не компилирует использование Comeau компилятор онлайн.
Вот код, который я использую:
#include <stdio.h>
//Comeau doesnt' have boost, so define our own enable_if_c
template<bool value> struct enable_if_c { typedef void type; };
template<> struct enable_if_c< false > {};
//Class that has the overloaded member function
class TestClass
{
public:
void Func(float value) { printf( "%f\n", value ); }
void Func(int value) { printf( "%i\n", value ); }
};
//Struct to detect if TestClass has an overloaded member function for type T
template<typename T>
struct HasFunc
{
template<typename U, void (TestClass::*)( U )> struct SFINAE {};
template<typename U> static char Test(SFINAE<U, &TestClass::Func>*);
template<typename U> static int Test(...);
static const bool Has = sizeof(Test<T>(0)) == sizeof(char);
};
//Use enable_if_c to only allow the function call if TestClass has a valid overload for T
template<typename T> typename enable_if_c<HasFunc<T>::Has>::type CallFunc(TestClass &test, T value) { test.Func( value ); }
int main()
{
float value1 = 0.0f;
int value2 = 0;
TestClass testClass;
CallFunc( testClass, value1 ); //Should call TestClass::Func( float )
CallFunc( testClass, value2 ); //Should call TestClass::Func( int )
}
Сообщение об ошибке: никакой экземпляр шаблона функции "CallFunc" не соответствует списку аргументов. Кажется что HasFunc:: Имеет ложь для интервала и плавания, когда это должно быть верно.
Действительно ли это - ошибка в компиляторе Comeau? Я делаю что-то, что это не стандартно? И если так, что я должен сделать для фиксации его?
Я предполагаю, что вопрос теперь становится, если это - ошибка, есть ли что-нибудь, что я могу сделать для работы вокруг этого? Я пытался использовать static_cast на &TestClass:: Func, но или это не возможно, или я не разобрался в синтаксисе, потому что я не мог заставить его компилировать.
Если это не решение, есть ли какие-либо модификации, которые я могу сделать или к TestClass или к HasFunc для работы вокруг проблемы?
Я подозреваю, что проблема в том, что, поскольку TestClass перегружает Func, и компилятор Comeau не может устранить неоднозначность & TestClass :: Func, даже если он должен.