gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:26:00 25 4
gpt4 key购买 nike

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

我有一个看起来像这样的特质:

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))

应该可以解决问题。

关于c++ - 如何完美转发一个struct成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38023861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com