如何像未定义的函数一样传递未定义的方法

Posted

技术标签:

【中文标题】如何像未定义的函数一样传递未定义的方法【英文标题】:How Can I Pass an Undefined Method Like an Undefined Function 【发布时间】:2016-07-20 13:33:32 【问题描述】:

鉴于我正在传递 undefined 函数:

void foo(char, short);

我learned how通过这个函数调用decltype(m(foo))来获取参数的类型tuple

template <typename Ret, typename... Args>
tuple<Args...> m(Ret(Args...));

我现在想传递一个 undefined 方法:

struct bar  void foo(char, short); ;

我曾尝试重写m,例如:

template <typename Ret, typename C, typename... Args>
tuple<Args...> m(Ret(C::*)(Args...));

但是当I try to call this 与decltype(m(bar::foo)) 类似时,我得到了错误:

无效使用非静态成员函数void bar::foo(char, short int)

我怎样才能像传递函数一样传递这个方法?

【问题讨论】:

请记住,非静态成员函数指针需要对其进行操作的类(对象)的实例。使用对象传递成员函数指针的一种方法是使用 std::function。请参阅print_add 示例:en.cppreference.com/w/cpp/utility/functional/function @RichardCritten 注意“undefined 函数”和“undefined 方法”function 对象不起作用,它们需要一个地址。坦率地说,我什至不确定 decltype(m(foo)) 是如何工作的,我只是有点接受它。 【参考方案1】:

如果你只想在上面使用decltype,你只需要一个额外的&amp;

decltype(m(&bar::foo))

【讨论】:

注意“undefined方法”我不能取地址。我会在问题中加粗,所以很清楚为什么这不是一个解决方案。当我传递它时,它几乎就像函数被视为表达式一样。不知道如何用方法做类似的事情。 @JonathanMee 为什么说“undefined 方法”?声明但未定义的方法?如果是这样,上面的代码可以完美运行。你给decltype 的表达式永远不会被计算。 "上面的代码完美运行"[原文如此] 我猜你在发表声明之前没有测试它:***.com/q/38402133/2642059 它根本不起作用。 @JonathanMee 我做了test it,你没有。您的代码与您提供的链接之间存在巨大的差异:在您的代码中,&amp;decltype 内。根据标准 decltype 说明符的操作数是一个未计算的操作数,并且 一个表达式可能会被计算,除非它是一个未计算的操作数(第 5 条)或其子表达式,所以 否,&amp;bar::foo 永远不会在上述上下文中被评估。 @JonathanMee 这与您几天前问的this question 中的行为完全相同-decltype() 中的任何内容都将永远被评估,因此您永远不会真的“取函数的地址”。所有编译器需要知道的是&amp;bar::foovoid (bar::*) (char, short); 类型,它从声明 中得到,由此推断出它需要考虑的m 的哪些重载,并由此它可以获取返回类型。

以上是关于如何像未定义的函数一样传递未定义的方法的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 在硬页面刷新后就像未初始化一样

VueJS - “this”在通用函数中未定义

何时使用缺失值与 NULL 值在 R 中传递未定义的函数参数,为啥?

通过单击事件传递动态值时,它在控制台中显示未定义

在 react s-s-r 应用程序中调用 firebase 消息传递方法时,如何修复 self 未定义?

变量传递不起作用 - 值未定义