C ++级联类型转换

时间:2013-02-22 12:56:51

标签: c++ type-conversion cascading

如何在级联转换类型时让类型转换工作?

以下代码应该很简单,但是从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
}

此致

2 个答案:

答案 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}}