我正在尝试实施std::bind
(我自己的namespase
是glgltinySTL
)。
所以我的代码就像你在第二个gist链接中看到的那样。有make_args()
和call_helper()
template <typename... BArgs, typename... Args, size_t... Is> inline
auto make_args(tuple<BArgs&&...> bind_args,
tuple<Args...>& args, index_holder<Is...>) noexcept
-> decltype(forward_as_tuple
(replace_place_holder
<min_place_holder_t<Args>::value,
static_cast<bool>(
is_placeholder<decltype(get<Is>(args))>::value)//!gcc exit here
>::foo(move(bind_args), get<Is>(args))...))
{
constexpr int MIN = min_place_holder_t<Args...>::value;
return forward_as_tuple(replace_place_holder<MIN, static_cast<bool>(
is_placeholder<
decltype(get<Is>(args))
>::value)
>::foo(move(bind_args), get<Is>(args))...);
}
template <typename F, typename... BArgs, typename... Args, size_t... Is> inline
auto call_helper(F &&f, tuple<BArgs&&...> bind_args,
tuple<Args...>& args, index_holder<Is...> ih)
noexcept(noexcept(f(get<Is>
(make_args(move(bind_args), args, ih))...)))
-> decltype(f(get<Is>(make_args(move(bind_args), args, ih))...))
{
auto a = make_args(move(bind_args), args, ih);
return f(get<Is>(move(a))...);
}
然后我做了一些测试,你可以在第二个要点链接中看到(从第1400行到第1403行)。
在gcc5.2.0下运行良好。
所以我开始测试它是否适用于成员函数。
auto bm = glgltinySTL::bind(&callable_t::foo, _6, 5, 6ul, _5);
bm('c', &c);
然后,我得到了一些奇怪的错误如下。
https://gist.github.com/anonymous/5dfca64265406898073d
所以,我开始测试make_args()
。
auto a = glgltinySTL::make_tuple(_6, 5, 6ul, _5);
auto tm = glgltinySTL::BIND_HELPER::make_args(
glgltinySTL::forward_as_tuple('c', &c), a,
glgltinySTL::index_holder<0, 1, 2, 3>());
然后,gcc显示&#34;不能从先前的错误中恢复,退出(无法从先前的错误中恢复,退出)&#34;。
然后我测试跟随make_args()
做(从第1420行到第1440行)。
效果很好。
所以,我的问题是这个函数调用有什么问题?
这是源文件,我添加了一些inline namespace
以使其他东西可折叠。
https://gist.github.com/anonymous/973110af6a6edc186394
在此之后,我发现还有另一种方法可以写make_args()
和call_helper()
。
template <typename... BArgs, typename... Args, size_t... Is> constexpr
auto make_args(tuple<BArgs&&...> bind_args,
tuple<Args...>& args, index_holder<Is...>) noexcept
-> decltype(forward_as_tuple
(replace_place_holder
<min_place_holder_t<Args>::value,
is_placeholder<decltype(get<Is>(args))>::value
>::foo(move(bind_args), get<Is>(args))...));
template <typename F, typename... BArgs, typename... Args, size_t... Is> inline
auto call_helper(F &&f, tuple<BArgs&&...> bind_args,
tuple<Args...>& args, index_holder<Is...> ih)
noexcept(noexcept(f(get<Is>(
declval<decltype(make_args(move(bind_args), args, ih))>()
)...)))
-> decltype(f(get<Is>(
declval<decltype(make_args(move(bind_args), args, ih))>()
)...))
{
constexpr int MIN = min_place_holder_t<Args...>::value;
auto a = forward_as_tuple(
replace_place_holder<
MIN, is_placeholder<decltype(get<Is>(args))>::value
>::foo(move(bind_args), get<Is>(args))...);
return f(get<Is>(move(a))...);
}
Gcc会显示相同的错误,但不会退出。