std::is_convertible, std::is_nothrow_convertible
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <type_traits> で定義
|
||
template< class From, class To > struct is_convertible; |
(1) | (C++11以上) |
template< class From, class To > struct is_nothrow_convertible; |
(2) | (C++20以上) |
1) 架空の関数の定義
To test() { return std::declval<From>(); } が well-defined であれば (つまり、 std::declval<From>() が暗黙の変換を用いて To に変換できるか、 From と To がどちらも void または cv 修飾された void であれば)、 true に等しいメンバ定数 value が提供されます。 そうでなければ value は false です。 このチェックの目的に対しては、 return 文での std::declval の使用は ODR 使用とみなされません。 アクセスチェックはいずれの型とも無関係の文脈からであるかのように行われます。 return 文の直接の文脈の有効性 (戻り値型への変換を含む) のみが考慮されます。
2) (1) と同じですが、変換は
noexcept でもあります。From および To はいずれも完全型 (またはその cv 修飾された型)、 void、またはサイズの未知な配列でなければなりません。 そうでなければ、動作は未定義です。
上記のテンプレートの実体化が直接または間接的に不完全型に依存しており、もしその型が仮に完全型であったならばその実体化が異なる結果を産むであろう場合は、動作は未定義です。
ヘルパー変数テンプレート
<tbody> </tbody> template< class From, class To > inline constexpr bool is_convertible_v = is_convertible<From, To>::value; |
(C++17以上) | |
template< class From, class To > inline constexpr bool is_nothrow_convertible_v = is_nothrow_convertible<From, To>::value; |
(C++20以上) | |
std::integral_constant から継承
メンバ定数
value [静的] |
From が To に変換可能ならば true、そうでなければ false (パブリック静的メンバ定数) |
メンバ関数
operator bool |
オブジェクトを bool に変換します。 value を返します (パブリックメンバ関数) |
operator() (C++14) |
value を返します (パブリックメンバ関数) |
メンバ型
| 型 | 定義 |
value_type
|
bool
|
type
|
std::integral_constant<bool, value>
|
ノート
参照型、 void 型、配列型、関数型に対して well-defined な結果を与えます。
例
Run this code
#include <iostream>
#include <type_traits>
class E { public: template<class T> E(T&&) { } };
int main()
{
class A {};
class B : public A {};
class C {};
class D { public: operator C() { return c; } C c; };
bool b2a = std::is_convertible<B*, A*>::value;
bool a2b = std::is_convertible<A*, B*>::value;
bool b2c = std::is_convertible<B*, C*>::value;
bool d2c = std::is_convertible<D, C>::value;
// A Perfect Forwarding constructor make the class 'convert' from everything
bool everything2e = std::is_convertible<A, E>::value; //< B, C, D, etc
std::cout << std::boolalpha;
std::cout << b2a << '\n';
std::cout << a2b << '\n';
std::cout << b2c << '\n';
std::cout << d2c << '\n';
std::cout << '\n';
std::cout << everything2e << '\n';
}
出力:
true
false
false
true
true