Как я могу получить возвращаемый тип неявного преобразования объекта?
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 также верно для float, unsigned int и т. д. Я хотел бы иметь точный тип.
Изменить: поскольку мой вопрос кажется неясным, почему я хочу знать тип неявного преобразования. Подумайте, пожалуйста, на шаг дальше к шаблонным классам. Так что я совсем не знаю Бар ...
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 я хотел бы получить плавающий. Для бара внутр.
Но поскольку я могу определить одно или несколько неявных преобразований для класса, это становится непросто.
struct FooBar {
operator float() const {
return 0;
}
operator int() const {
return 0;
}
};
Не работает в прямом эфире пример.
Итак, в целом невозможно получить правильный тип неявного разговора для класса?
operator int()
имеет тип возвратаint
, чтобы получить это, вам не нужно никаких сложных шагов. - person M.M   schedule 31.03.2016