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