如何在级联转换类型时让类型转换工作?
以下代码应该很简单,但是从TypeB到int的转换要求编译器自动推导出两种类型的转换。但事实并非如此。
我不能简单地实施 operator int()const {return val; } 在TypeB类上,因为这应该是一个模板类我不知道要转换为哪种类型。
class TypeA {
public:
TypeA( int a ) : val( a ) {}
operator int () const { return val; }
private:
int val;
};
class TypeB {
public:
TypeB( TypeA a ) : val( a ) {}
operator TypeA () const { return val; }
// operator int() const { return val; } // Explicit conversion to int which I can not know.
private:
TypeA val;
};
void main() {
TypeA a = 9;
TypeB b = a;
int int_a = a;
TypeA a2 = b;
int int_b = b; // Compilation error:
// No suitable conversion function from 'TypeB' to 'int' exists
}
此致
答案 0 :(得分:3)
在任何隐式转换序列中,您最多允许一次隐式用户定义转换。
但是,您可以说int int_b = static_cast<TypeA>(b);
将UDC的数量减少到一个。
答案 1 :(得分:0)
因此,您希望TypeB<T>
使用T
的用户定义转换?
创建一个模板operator U
,该模板T
使用SFINAE检查U
的转换运算符,并在T
类型operator U
具有std::is_convertible
时接受。
T::operator U
enable_if
的地址不够简便,可能更好。
这将要求C ++ 11功能合理地执行,因为您需要在默认模板参数中使用#include <utility>
#include <type_traits>
#include <iostream>
struct A {
operator int() { return 7; }
};
template<typename T>
struct unevaluated: std::true_type {};
template<typename T, typename U, typename=void>
struct has_user_defined_conversion:std::false_type {};
template<typename T, typename U>
struct has_user_defined_conversion<T, U,
typename std::enable_if< unevaluated<
decltype(
&T::operator U
)
>::value >::type
>: std::true_type {};
template<typename T>
struct fake {
T t;
template<typename U,
typename=typename std::enable_if<has_user_defined_conversion<T,U>::value>::type
>
operator U() { return t; }
};
int main() {
int x = fake<A>();
std::cout << x << "\n";
}
。
这是一个粗略的实现:我没有涵盖具有采用源类型的构造函数的目标类型。
{{1}}