【发布时间】:2020-12-04 13:54:12
【问题描述】:
我希望以下代码能够编译和工作:
#include <boost/hana/group.hpp>
#include <functional>
#include <vector>
int main() {
std::vector<int> x = {1,1,3,4};
auto groups = boost::hana::group(x, std::equal_to<>{});
}
尝试编译这样的错误:
$ g++ -std=c++2a deleteme.cpp && ./a.out
In file included from deleteme.cpp:1:
/usr/include/boost/hana/group.hpp: In instantiation of ‘constexpr auto boost::hana::group_t::operator()(Xs&&, Predicate&&) const [with Xs = std::vector<int>&; Predicate = std::equal_to<void>]’:
deleteme.cpp:6:44: required from here
/usr/include/boost/hana/group.hpp:55:42: error: static assertion failed: hana::group(xs, predicate) requires 'xs' to be a Sequence
55 | static_assert(hana::Sequence<S>::value,
| ^~~~~
/usr/include/boost/hana/group.hpp:59:28: error: use of deleted function ‘static constexpr auto boost::hana::deleted_implementation::apply(T&& ...) [with T = {std::vector<int, std::allocator<int> >&, std::equal_to<void>}]’
59 | return Group::apply(static_cast<Xs&&>(xs),
| ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
60 | static_cast<Predicate&&>(pred));
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/boost/hana/core/dispatch.hpp:14,
from /usr/include/boost/hana/drop_front.hpp:18,
from /usr/include/boost/hana/concept/iterable.hpp:20,
from /usr/include/boost/hana/at.hpp:16,
from /usr/include/boost/hana/group.hpp:15,
from deleteme.cpp:1:
/usr/include/boost/hana/detail/dispatch_if.hpp:21:31: note: declared here
21 | static constexpr auto apply(T&& ...) = delete;
| ^~~~~
因此我理解原因是std::vector 不满足Sequence 的概念,但是我该如何强制它呢?
我一直在看/usr/include/boost/hana/fwd/concept/sequence.hpp 和/usr/include/boost/hana/concept/sequence.hpp,但是现在这些文件中的模板元元编程对于我来说在没有任何帮助的情况下理解它仍然有点繁重。
This is an excerpt from Hana's documentation,我认为它解决了这个问题。关键是我不知道如何将这些处方翻译成代码:
因此,有必要专门化 Hana 命名空间中的 Sequence 元函数告诉 Hana 一个类型 确实是一个序列。明确专业化 序列元函数可以看作是一个印章,上面写着“这个数据 类型满足
Sequence" 的附加法则,因为那些不能 由 Hana 自动检查。
【问题讨论】:
-
您不能强制使用您未编写的标准库类型来匹配您未编写的概念??
-
-
我在质疑你的问题,因为它在逻辑上是不可能的。
-
除非您提供自己的编译器库,否则实际上是不可能的
-
@BaileyKocin 然后写一个答案,用比你不能和不可能更具体的东西来证明你的陈述。
标签: c++ functional-programming c++14 template-meta-programming boost-hana