是否可以使用范围适配器将投影成员还原为原始 class 对象?

Is it possible to use ranges adaptors to revert the projected member to the original class object?

C++20 带来了非常强大的投影实用程序。 transform_viewelements_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?

通常不可能根据一个对象的 子对象 的身份来识别一个对象,即使您知道它是哪个子对象而不仅仅是它的类型(这可能留下多种可能性)。指针算法模型不允许这样做,部分原因是它允许某些别名 优化 当编译器可以看到一个对象无法从另一个对象“访问”时。