Получить тип неявного преобразования

Как я могу получить возвращаемый тип неявного преобразования объекта?

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;
   }
};

Не работает в прямом эфире пример.

Итак, в целом невозможно получить правильный тип неявного разговора для класса?


person Viatorus    schedule 30.03.2016    source источник
comment
decltype () и авто?   -  person Vasiliy Soshnikov    schedule 30.03.2016
comment
decltype ‹Bar ()› - это Bar, а auto f = Bar; - это Bar.   -  person Viatorus    schedule 30.03.2016
comment
Бар b; decltype ((int) b) x = (int) b;   -  person Vasiliy Soshnikov    schedule 30.03.2016
comment
Неявное преобразование во что? В вашем случае это ясно, но каков был бы желаемый результат, если бы было более 1 оператора преобразования?   -  person anderas    schedule 30.03.2016
comment
@Vasiliy Soshnikov Значит, я должен знать тип раньше ...? Плохой. (a) anderas Хорошее замечание ... ну так я не могу понять тип?   -  person Viatorus    schedule 30.03.2016
comment
@Viatorus да, или вам нужен тип хранения внутри класса, например Bar {typedef int my_conv_type; }   -  person Vasiliy Soshnikov    schedule 30.03.2016
comment
Я не уверен, в чем ваш вопрос. operator int() имеет тип возврата int, чтобы получить это, вам не нужно никаких сложных шагов.   -  person M.M    schedule 31.03.2016
comment
Редактирую свой вопрос. Пожалуйста, посмотри, понимаешь ли ты меня сейчас. Если я не знаю Bar (внутри класса шаблона), как я могу узнать, есть ли в Bar оператор int ().   -  person Viatorus    schedule 31.03.2016


Ответы (1)


#include <iostream>
#include <typeinfo>
struct Bar {
    operator int() const {
        return 0;
    }
    operator double() const {
        return 0.0;
    }

    struct Foo {

    };
    operator Foo() const {
        return Foo();
    }
};
int main() {
    std::cout << typeid( decltype((int)Bar()) ).name();
    std::cout << std::endl;
    std::cout << typeid( decltype((double)Bar()) ).name();
    std::cout << std::endl;
    std::cout << typeid( decltype((Bar::Foo)Bar()) ).name();
    std::cout << std::endl;
}

В соответствии с этим фактом, эта функция Bar::operator int() является функцией-членом класса Bar, вы гарантируете, что для нее существует this ссылка, поэтому я предоставляю объект по умолчанию Bar() для всего материала.

Результат:

i
d
N3Bar3FooE
person Pleeea    schedule 30.03.2016
comment
decltype( (int)X ) всегда дает int&, ничего общего с Bar ... хотя вопрос OP неясен - person M.M; 31.03.2016
comment
Вопрос OP неясен, но, очевидно, это не так: каков тип возвращаемого значения Anything :: operator int (). Было бы неплохо, если бы кто-то вообще ответил про неявные преобразования. - person Pleeea; 31.03.2016
comment
Редактирую свой вопрос. Пожалуйста, посмотри, понимаешь ли ты меня сейчас. Я не знаю Bar, поэтому (C) -Cast невозможен. - person Viatorus; 31.03.2016