1

型変換をカスケードするときに型変換を機能させるにはどうすればよいですか?

次のコードは単純なはずですが、TypeBからintへの変換では、コンパイラーが2つの型変換を自動的に推測する必要があります。しかし、そうではありません。

演算子int()const{returnval;を単純に実装することはできません。これはテンプレートクラスであると想定されているため、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
}

よろしく

4

2 に答える 2

3

暗黙的な変換シーケンスでは、最大で 1 つの暗黙的なユーザー定義の変換が許可されます。

int int_b = static_cast<TypeA>(b);ただし、UDC の数を 1 つに減らすには、と言うことができます。

于 2013-02-22T12:58:27.840 に答える
0

TypeB<T>のユーザー定義変換を使用したいTですか?

operator USFINAE を使用して変換演算子を調べ、型にfor があるT場合に受け入れるテンプレートを作成します。UToperator 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";
}
于 2013-02-22T13:07:04.273 に答える