首页 > 解决方案 > 如何完善转发成员变量

问题描述

考虑以下代码:

template<typename T> void foo(T&& some_struct)
{
    bar(std::forward</* what to put here? */>(some_struct.member));
}

在转发整个结构的情况下,我会这样做std::forward<T>(some_struct)。但是在转发成员时如何获得正确的类型?

我的一个想法是使用decltype(some_struct.member),但这似乎总是产生该成员的基本类型(如结构定义中所定义)。

标签: c++perfect-forwarding

解决方案


会员访问在这里做正确的事:您只需要std::forward<T>(some_struct).member.

经测试:

template <class... >
struct check;

struct Foo {
    int i;
};

template <class T>
void bar(T &&f) {
    // fatal error: implicit instantiation of undefined template 'check<int &&>'
    check<decltype((std::forward<T>(f).i))>{};
}

int main() {
    bar(Foo{42});
}

推荐阅读