如何完美转发一个struct成员?

How to perfectly forward a struct member?

我正在尝试进行一些通用编程,其中我获取某个结构的实例(已以某种方式注册)并对其成员的每个子集执行特殊操作。

我的性格有点像这样:

template <typename S>
struct visitable<S, std::enable_if_t<is_visitable<S>::value>> {
  template <typename V, typename T>
  static void apply_visitor(V && v, T && t) {
    v(t.*(get_registered_member_ptr<S>::value));
  }
}

template <typename V, typename S>
void apply_visitor(V && v, S && s) {
  visitable<std::remove_cv_t<std::remove_reference_t<S>>>::apply_visitor(std::forward<V>(v), std::forward<S>(s));
}

这是一种简化,实际上将有多个成员指针,访问者将被应用多次。但这触及了问题的核心。

在此代码中,TS 的类型相同,但带有一些我正在使用的 CV / 参考限定符,因此我不必输入所有手动超载。我想用与用户传递的表达式相同的值类型调用访问者。

但是当我想将指针应用到成员时,我遇到了一个问题,因为当我将它传递给访问者时我不能再使用 std::forward 来获得正确的限定符。

是否有一个奇特的 std::forward 版本可以做到这一点,例如,将第一个模板参数的 CV 和引用限定符应用到第二个参数并给我结果?还是我应该补一个?或者有没有更好的成语。

std::forward<V>(v)(std::forward<T>(t).*(get_registered_member_ptr<S>::value))

应该可以解决问题。