获取隐式转换的类型

Get type of implicit conversion

本文关键字:类型 转换 获取      更新时间:2023-10-16

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

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_convertable对于float、unsigned int等也是true……我想要确切的类型。

编辑:因为我的问题似乎不清楚,为什么我想知道隐式转换类型。请进一步考虑模板类。所以我一点也不了解Bar。。。

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

不起作用的实例。

所以总的来说,不可能得到一个类的正确的隐含对话类型?

#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