如何获取对象的隐式转换的返回类型?
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;
}
};
总而言之,不可能获得类的正确隐式会话类型?
答案 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