关于我的绑定实现,这个函数调用有什么问题?

时间:2015-11-11 08:39:05

标签: c++ c++11

我正在尝试实施std::bind(我自己的namespaseglgltinySTL)。

所以我的代码就像你在第二个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会显示相同的错误,但不会退出。

0 个答案:

没有答案