【问题标题】:Taking the address of boost::hana::partial::operator()取 boost::hana::partial::operator() 的地址
【发布时间】:2018-08-11 14:01:01
【问题描述】:

假设我有一个 lambda 可以做某事:

auto thing = [](int x){ /* Stuff */ };

我想保存值“x”并稍后调用它,所以我这样做:

auto other = boost::hana::partial(thing, 42);

现在,因为我想对此进行一些类型擦除,所以我想获取operator().....所以我尝试这样做:

using type = decltype(other);
void (type::*ptr)(void) = &type::operator();

Clang 抱怨,other 对象没有满足要求的足够功能:godbolt

似乎partial 类型正在返回一个引用(到void?)......为什么这不起作用?

【问题讨论】:

  • 为什么要指定void (type::*ptr)(void)?为什么不只是auto ptr = &type::operator();? +1 使用 Boost Hana。
  • @Eljay 我需要指定类型,因为这实际上是一个模板怪物的深处,需要能够处理重载(这意味着需要指定类型)

标签: c++ c++14 function-pointers boost-hana


【解决方案1】:

它(operator())有&const&&&等重载;您的成员函数指针不能通过 const 或 r/l 值来限定 *this。所以不匹配。

在编译失败的那一行=前加上&const&&&const&&,就可以编译了。

这是一个 [MCVE]:

struct foo {
    void bar()&{}
};

int main(){
    auto p = &foo::bar;
    void(foo::*p2)() = p; // lacks &
}

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多