Из небольшого исследования, которое я провел (и игнорируя комментарий С ++ 0x от Йоханнеса), я отвечаю, что это зависит от того, для чего вы хотите enable_if
. Если вы хотите, чтобы операция преобразования в T
существовала или отсутствовала в типе T
, тогда кажется, что ответ отрицательный, в C ++ 03 нет пути (как сказал Ugo). Но если вам нужно enable_if
для изменения поведения оператора в зависимости от типа T
, тогда да, есть обходной путь, который заключается в вызове включенной вспомогательной функции (называемой to<T>
как Предложил Матье).
#include<iostream>
#include<boost/utility/enable_if.hpp>
#include<boost/type_traits/is_class.hpp>
struct B{
B(const B& other){}
B(){}
};
struct A{
template<class T>
T to(typename boost::enable_if_c<not boost::is_class<T>::value, void*>::type = 0){
std::clog << "converted to non class" << std::endl;
return T(0);
}
template<class T>
T to(typename boost::enable_if_c<boost::is_class<T>::value, void*>::type = 0){
std::clog << "conveted to class" << std::endl;
return T();
}
template<class T>
operator T(){
return to<T>();
}
};
int main(){
A a;
double d = (double)a; // output: "converted to non class"
B b = (B)(a); // output: "converted to class"
return 0;
}
Для справки, я был разочарован этим в течение нескольких дней, пока не понял, что хочу enable_if
не для SFINAE, а для изменения поведения во время компиляции. Вы также можете обнаружить, что это реальная причина вашей потребности в enable_if
. Просто предложение.
(Обратите внимание, что это ответ для эры C ++ 98)