是否可以使用范围适配器将投影成员还原为原始 class 对象?
Is it possible to use ranges adaptors to revert the projected member to the original class object?
C++20 带来了非常强大的投影实用程序。 transform_view
和 elements_view
等一些范围适配器允许我们轻松地将操作投影到原始 class 对象的成员变量 (godbolt):
auto historical_figures = vector{
pair{"Lovelace"sv, 1815},
{"Turing"sv, 1912},
{"Babbage"sv, 1791},
{"Hamilton"sv, 1936}
};
// view of ints
auto birth_years = historical_figures
| views::transform(&pair<string_view, int>::second);
但是我们能否将投影后的成员变量重新投影回原来的class对象呢?例如:
// views of pair<string_view, int>
auto origin_figures = historical_figures
| views::transform(&pair<string_view, int>::second)
| views::reproject<pair<string_view, int>>;
之所以这么问是因为projection函数是[=15=]类型的成员对象指针,里面好像保存了被投影class的类型信息,所以可能有点潜力与原始对象的转换关系。
理论上可行吗?如果可能的话,我们可以使用范围适配器来构造这个重投影吗?如果不可能,是否可以重新投影 std::pair
?
通常不可能根据一个对象的 子对象 的身份来识别一个对象,即使您知道它是哪个子对象而不仅仅是它的类型(这可能留下多种可能性)。指针算法模型不允许这样做,部分原因是它允许某些别名 优化 当编译器可以看到一个对象无法从另一个对象“访问”时。
C++20 带来了非常强大的投影实用程序。 transform_view
和 elements_view
等一些范围适配器允许我们轻松地将操作投影到原始 class 对象的成员变量 (godbolt):
auto historical_figures = vector{
pair{"Lovelace"sv, 1815},
{"Turing"sv, 1912},
{"Babbage"sv, 1791},
{"Hamilton"sv, 1936}
};
// view of ints
auto birth_years = historical_figures
| views::transform(&pair<string_view, int>::second);
但是我们能否将投影后的成员变量重新投影回原来的class对象呢?例如:
// views of pair<string_view, int>
auto origin_figures = historical_figures
| views::transform(&pair<string_view, int>::second)
| views::reproject<pair<string_view, int>>;
之所以这么问是因为projection函数是[=15=]类型的成员对象指针,里面好像保存了被投影class的类型信息,所以可能有点潜力与原始对象的转换关系。
理论上可行吗?如果可能的话,我们可以使用范围适配器来构造这个重投影吗?如果不可能,是否可以重新投影 std::pair
?
通常不可能根据一个对象的 子对象 的身份来识别一个对象,即使您知道它是哪个子对象而不仅仅是它的类型(这可能留下多种可能性)。指针算法模型不允许这样做,部分原因是它允许某些别名 优化 当编译器可以看到一个对象无法从另一个对象“访问”时。