Я пытаюсь использовать 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 :: Has имеет значение false для int и float, когда оно должно быть истинным.
Это ошибка в компиляторе Comeau? Я делаю что-то, что не является стандартным? И если да, что мне нужно сделать, чтобы это исправить?
Обновление
Полагаю, теперь возникает вопрос: если это ошибка, могу ли я что-нибудь сделать, чтобы обойти ее? Я попытался использовать static_cast для & TestClass :: Func, но либо это невозможно, либо я неправильно понял синтаксис, потому что не смог его скомпилировать.
Если это не решение, могу ли я внести какие-либо изменения в TestClass или HasFunc, чтобы обойти эту проблему?