所以我有几个函数,我得到了一个魔术函数对象,该对象在以下方面提供重载分辨率:
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的文档没有说任何一种方法),如果是这样,为什么当我将其作为成员放入类时为什么失败了?
答案 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