获取隐式转换的类型

时间:2016-03-30 07:09:24

标签: c++ c++11 typetraits type-deduction

如何获取对象的隐式转换的返回类型?

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,我想浮动。对于Bar int。

但是因为我可以为类定义一个或多个隐式转换,所以它变得棘手。

struct FooBar {
  operator float() const {
     return 0;
   }

   operator int() const {
     return 0;
   }
};

Not working live example.

总而言之,不可能获得类的正确隐式会话类型?

1 个答案:

答案 0 :(得分:-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