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 的转换运算符,并在UT 具有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++ 级联类型转换的主要内容,如果未能解决你的问题,请参考以下文章

C++ 数据类型转换

C++ 或 Java 中的类型转换和类型转换有啥区别?

c++中的类型转换

C++的类型转换

C++从青铜到王者第二十四篇:C++的类型转换

c++类型转换