C++ 级联类型转换
Posted
技术标签:
【中文标题】C++ 级联类型转换【英文标题】:C++ Cascading type conversion 【发布时间】:2013-02-22 12:56:50 【问题描述】:在级联类型转换时如何使类型转换工作?
下面的代码应该很简单,但是从 TypeB 到 int 的转换需要编译器自动推导出两次类型转换。但事实并非如此。
我不能简单地实现 运算符 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
问候
【问题讨论】:
【参考方案1】:在任何隐式转换序列中,您最多可以进行一次用户定义的隐式转换。
不过,您可以说 int int_b = static_cast<TypeA>(b);
将 UDC 的数量减少到一个。
【讨论】:
【参考方案2】:所以您希望TypeB<T>
使用T
的用户定义转换?
创建一个模板operator U
,该模板使用SFINAE 来检查T
的转换运算符,并在U
是T
具有operator U
的类型时接受。
一个不充分但简单的方法是std::is_convertible
——T::operator U
的地址可能更好。
这将需要 C++11 功能才能合理执行,因为您需要在默认模板参数中使用 enable_if
。
这是一个粗略的实现:我没有涵盖具有采用源类型的构造函数的目标类型。
#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";
【讨论】:
以上是关于C++ 级联类型转换的主要内容,如果未能解决你的问题,请参考以下文章