为什么不能将boost :: hana :: overload_t成为类的成员

时间:2018-06-30 17:39:36

标签: c++ c++14 overloading boost-hana

所以我有几个函数,我得到了一个魔术函数对象,该对象在以下方面提供重载分辨率:

void foo1();
void foo2(int);


auto foo_ptr = boost::hana::overload(foo1,foo2);
//Later
foo_ptr(12);  //Both Valid (Yeah!)
foo_ptr();

但是当我做这样的事情时就会出现问题:

using ptr_t = decltype(foo_ptr);

struct mine
{
    ptr_t ptr;
    mine(ptr_t ptr) : ptr(ptr){}
};


mine m(foo_ptr);

当我尝试编译此代码时,我得到error: no matching function for call to 'boost::hana::overload_t<void (*)(int)>::overload_t()'

godbolt上自己看看.....

现在我的问题是这个

我是否可以复制这些重载对象(hana的文档没有说任何一种方法),如果是这样,为什么当我将其作为成员放入类时为什么失败了?

1 个答案:

答案 0 :(得分:6)

这可以说是Boost.Hana中的错误。 overload_t的构造函数为:

Debug.Print Objie.Document.querySelector("table:last-child .table_label ~ td").innerText

请注意,这些是不受限制的转发参考。这是一个常见问题,即当您具有非恒定对象时,使转发引用构造函数比复制构造函数更好地匹配。简化示例:

$xml_path = '/path_to_file/file.xml';
$reader = new XMLReader();
if ($reader->open($xml_path)) {
  while ($reader->read() && $reader->name !== 'Art');
  while ($reader->nodeType == XMLReader::ELEMENT && $reader->name === 'Art') {
    $node = simplexml_load_string($reader->readOuterXML());

    // NEW CODE!
    if (isset($node->Art)) {
      $reader->read();
    }

    // Get the "Code" in the current "Art".
    $current_code = (string)$node->Code;
    // Do something with $current_code...

    $reader->next('Art');
  }
  $reader->close();
}

但是,如果对象为template <typename F_, typename ...G_> constexpr explicit overload_t(F_&& f, G_&& ...g) : overload_t<F>::type(static_cast<F_&&>(f)) , overload_t<G...>::type(static_cast<G_&&>(g)...) { } ,则复制构造函数将是更好的匹配。因此,简单的解决方法是:

struct X {
    X();
    template <typename F> X(F&&); 
    X(X const&) = default;
};

X x1;
X x2(x1); // does *not* call the copy constructor

现在可以编译了。同样,正如Yakk所建议的,出于相同的原因,移动而不是复制也可以起作用:

const