Как я могу получить возвращаемый тип неявного преобразования объекта?Получить тип неявного преобразования
struct Bar {
operator int() const {
return 0;
}
};
// std::result_of<Bar>::type value; ???
// std::result_of<Bar::operator ??? >::type value;
Я мог бы использовать:
std::is_convertible<Bar, int>::value
но шаблона is_convertible также верно для поплавка, беззнаковое целочисленное значение и т.д .... Я хотел бы иметь точный тип.
Редактировать: Поскольку мой вопрос кажется неясным, почему я хочу знать неявный тип преобразования. Пожалуйста, подумайте о шагах от классов шаблонов. Так что я не знаю Бар вообще ...
template<typename T, typename Sfinae = void>
struct ImplicitType
{
static_assert(sizeof(T) != sizeof(T), "Unknown type.");
};
template<typename T>
struct ImplicitType<T,
typename std::enable_if<std::is_convertible<T, int>::value && std::is_class<T>::value>::type>
{
using type = int;
};
template<typename T>
struct ImplicitType<T,
typename std::enable_if<std::is_convertible<T, float>::value && std::is_class<T>::value>::type>
{
using type = int;
};
struct Foo
operator float() const {
return 0.0f;
}
};
struct Bar {
operator int() const {
return 0;
}
};
ImplicitType<Foo> r; // <--- ambiguous template instantiation
ImplicitType<Bar> r; // <--- ambiguous template instantiation
Для Foo я хотел бы получить поплавок. Для Bar int.
Но поскольку я могу определить одно или несколько неявных преобразований для класса, это становится сложным.
struct FooBar {
operator float() const {
return 0;
}
operator int() const {
return 0;
}
};
Так что в целом это не возможно, чтобы получить право неявного типа разговора класса?
decltype() и авто? –
*** decltype *** - Бар и *** авто f = Бар; *** - Бар. –
Viatorus
Бар b; decltype ((int) b) x = (int) b; –