我正在尝试进行一些通用编程,其中我采用了一些结构的实例(已经以某种方式注册)并对其成员的某个子集执行特殊操作。
我有一个看起来像这样的特征:
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));
}
这是一个简化,实际上会有几个成员指针,访问者将被多次应用。但它触及了问题的核心。
在此代码中,T
与S
的类型相同,但我会使用一些CV /引用限定符,因此我不必输入手动完成所有重载。我想使用与用户传递的表达式相同的值类型来调用访问者。
但是当我想将指针应用于成员时,我遇到了一个问题,因为当我将其传递给访问者时,我不能再使用std::forward
来获得正确的限定词。
是否有std::forward
的精美版本可以做到这一点,比如,将第一个模板参数的CV和引用限定符应用于第二个参数并给我结果?或者我应该做一个?或者有更好的成语。
答案 0 :(得分:1)
std::forward<V>(v)(std::forward<T>(t).*(get_registered_member_ptr<S>::value))
应该做的伎俩。