转发参数

发布于 2025-01-02 14:19:47 字数 495 浏览 1 评论 0原文

我有一个形式的构造:

template<class T>
    void do_something_with_it(T*&& ptr)
    {
//here I can do something with this ptr
    }

    template<class T,class... Args>
    void do_something_with_them(T*&& ptr, Args&&... args)
    {
        do_something_with_it(std::forward<T&&>(ptr));
        do_something_with_them(std::forward<Args&&>(args)...);
    }

但由于某种原因我无法转发这些论点。有办法做到吗?
我正在使用 gcc 4.6.1。

I have a construct in a form:

template<class T>
    void do_something_with_it(T*&& ptr)
    {
//here I can do something with this ptr
    }

    template<class T,class... Args>
    void do_something_with_them(T*&& ptr, Args&&... args)
    {
        do_something_with_it(std::forward<T&&>(ptr));
        do_something_with_them(std::forward<Args&&>(args)...);
    }

but for some reason I cannot forward those arguments. Is there a way to do it?
I'm using gcc 4.6.1.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

去了角落 2025-01-09 14:19:47

您很可能会遇到编译时错误,因为 T*&& 并不是完美的转发工具。只有 T&& 是。因此,您的 ptr 参数仅接受右值。除此之外,您的 std::forward 应该是 std::forward,但当然现在您无论如何,还有其他错误,这无关紧要。除此之外,对 do_something_with_them 的调用会错过使用零参数的 do_something_with_them 的基本情况,因为如果 args 为空...

如果您确实只想接受指针,则可以使用 enable_ifis_sameis_convertible。但当然我不认为它是“转发”了。这样

template<typename T, typename ...Args>
auto do_something_with_them(T&&t, Args&&...args)
  -> decltype(do_something_with_it(std::forward<T>(t)))
{ ... }

你就可以让do_something_with_it决定它是否接受参数(如果你愿意,你也可以将递归调用放入decltype中。我把它作为练习向读者告知此处可能需要什么运算符)。当然,do_something_with_it 也有同样的问题,即不通用。

Chances are that you get compile time errors, because T*&& is not a perfect forwarding vehicle. Only T&& is. So your ptr parameter only accepts rvalues. And in addition to that, your std::forward<T&&> should be std::forward<T*>, but of course now that you have the other error anyway this is irrelevant. And in addition to that the call to do_something_with_them misses to hit a base case of do_something_with_them with zero parameters, because if args is empty...

If you really only want to accepts pointers, you can work with enable_if and is_same or is_convertible. But then of course I don't think it's "forwarding" anymore. What about

template<typename T, typename ...Args>
auto do_something_with_them(T&&t, Args&&...args)
  -> decltype(do_something_with_it(std::forward<T>(t)))
{ ... }

That way you let do_something_with_it decide whether or not it accepts the argument (if you want you can put the recursive call into that decltype too. I leave it as an exercise to the reader as to what operator might be needed here). But of course do_something_with_it has the same problem too about not being generic.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文