如何完美转发结构成员?

时间:2016-06-25 00:36:57

标签: c++ templates c++11 perfect-forwarding pointer-to-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和引用限定符应用于第二个参数并给我结果?或者我应该做一个?或者有更好的成语。

1 个答案:

答案 0 :(得分:1)

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

应该做的伎俩。