2016-03-30 2 views
0

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

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

Not working live example.

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

+0

decltype() и авто? –

+0

*** decltype *** - Бар и *** авто f = Бар; *** - Бар. – Viatorus

+0

Бар b; decltype ((int) b) x = (int) b; –

ответ

-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 
+0

'decltype ((int) X)' всегда дает 'int &', не имеет никакого отношения к 'Bar' ... хотя вопрос OP неясен –

+0

Вопрос OP неясен, но, очевидно, это не так:« Каков тип возврата Anything :: operator int() ". Было бы неплохо, если бы кто-то также ответил на неявные преобразования вообще. – Pleeea

+0

Я редактирую свой вопрос. Пожалуйста, посмотри, понимаешь ли ты меня сейчас. Я не знаю Бар, поэтому (C) -Каст невозможен. – Viatorus

Смежные вопросы