繁体   English   中英

成员函数指针中的通用引用

[英]Universal reference in a member function pointer

我在理解为什么以下代码无法编译时遇到了一些麻烦

#include <iostream>
#include <typeinfo>

#define PRINT_FUNC() {std::cout << __PRETTY_FUNCTION__ << std::endl;}

struct Obj {
    Obj(){PRINT_FUNC();}
    int run (float f, char *c) {
        PRINT_FUNC();
        return 0;
    }

    int fly () {
        PRINT_FUNC();
        return 0;
    }
};

template <typename OBJ, typename R, typename ... Args>
void call_obj_func (OBJ &&o, R(OBJ::*fn)(Args...), Args ... args) {
    PRINT_FUNC();
    (o.*fn)(args...);
}

int main () {
    Obj o;
    call_obj_func(o, &Obj::fly);
}

对于函数call_obj_func,我期望OBJ类型将同时用于rvlaue和lvalue类型。 但是,当使用左值类型进行调用时,编译器会抱怨使用以下类型有很多不足之处:Obj和Obj&

这意味着编译器不能确定是否使用obj的副本或对obj的引用。

我肯定会有一些语法错误,因为我希望同时使用左值和右值类型来编译函数call_obj_func。

我的假设是成员函数指针,因为语法(Obj&:: * fn)和(Obj :: * fn)可能具有不同的语义。 (尽管我找不到任何地方的差异)。

你可以写

template <typename OBJ, typename Method, typename ... Args>
void call_obj_func (OBJ &&o, const Method& fn, Args&& ... args) {
    PRINT_FUNC();
    (std::forward<OBJ>(o).*fn)(std::forward<Args>(args)...);
}

现场演示

目前,您与类型推导有冲突( Obj& vs Obj ,并且args可能有类似的问题)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM