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