Skip to content

Commit 906823b

Browse files
committed
reflection : 非メンバ関数のオーバーロードリストは取得できないことを明記
1 parent 6688b15 commit 906823b

1 file changed

Lines changed: 5 additions & 2 deletions

File tree

lang/cpp26/reflection.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ enum class Color { red, green, blue };
3232
template <typename E>
3333
requires std::is_enum_v<E>
3434
constexpr std::string_view to_string(E value) {
35-
template for (constexpr auto e : std::define_static_array(std::meta::enumerators_of(^^E)) { // 型から列挙子のリストを取得
35+
// 型Eから列挙子のリストを取得
36+
template for (constexpr auto e : std::define_static_array(std::meta::enumerators_of(^^E)) {
3637
if (value == [:e:]) {
3738
return std::meta::identifier_of(e); // 列挙子の名前を文字列として取得
3839
}
@@ -85,7 +86,7 @@ void f(double);
8586
// constexpr auto r = ^^f; // エラー: fはオーバーロードされている
8687
```
8788
88-
オーバーロードされた関数の個々のオーバーロードを取得するには、[`members_of()`](/reference/meta/members_of.md)を使用する。`members_of()`は各オーバーロードを個別のリフレクションとして返す。
89+
オーバーロードされた関数がクラスのメンバ関数である場合、個々のオーバーロードを取得するには[`members_of()`](/reference/meta/members_of.md)を使用する。`members_of()`は各オーバーロードを個別のリフレクションとして返す。
8990
9091
```cpp
9192
struct S {
@@ -104,6 +105,8 @@ consteval {
104105
* std::meta::access_context[link /reference/meta/access_context.md]
105106
* unchecked[link /reference/meta/access_context/unchecked.md]
106107

108+
非メンバ関数(名前空間スコープの関数)の場合、オーバーロード集合そのものをリフレクションとして取得する手段は存在しない。そのため、非メンバ関数でオーバーロード集合から特定のオーバーロードを扱いたい場合は、関数ポインタ型にキャストして型を明示するなどの手段が必要となる。汎用的に関数のオーバーロードをリフレクションで扱いたい場合は、クラスのメンバ関数として定義することが必要になる。
109+
107110
また、スプライスで関数のリフレクションを式に変換する場合、オーバーロード解決は行われず、そのリフレクションが表す特定の関数が直接使用される。
108111

109112

0 commit comments

Comments
 (0)