<small id='1Lv0b'></small><noframes id='1Lv0b'>

<legend id='1Lv0b'><style id='1Lv0b'><dir id='1Lv0b'><q id='1Lv0b'></q></dir></style></legend>
    • <bdo id='1Lv0b'></bdo><ul id='1Lv0b'></ul>

      <tfoot id='1Lv0b'></tfoot>

        <i id='1Lv0b'><tr id='1Lv0b'><dt id='1Lv0b'><q id='1Lv0b'><span id='1Lv0b'><b id='1Lv0b'><form id='1Lv0b'><ins id='1Lv0b'></ins><ul id='1Lv0b'></ul><sub id='1Lv0b'></sub></form><legend id='1Lv0b'></legend><bdo id='1Lv0b'><pre id='1Lv0b'><center id='1Lv0b'></center></pre></bdo></b><th id='1Lv0b'></th></span></q></dt></tr></i><div id='1Lv0b'><tfoot id='1Lv0b'></tfoot><dl id='1Lv0b'><fieldset id='1Lv0b'></fieldset></dl></div>

        如何结合 std::bind()、可变参数模板和完美转发?

        时间:2023-05-24

          1. <small id='AbeYH'></small><noframes id='AbeYH'>

          2. <legend id='AbeYH'><style id='AbeYH'><dir id='AbeYH'><q id='AbeYH'></q></dir></style></legend>

            <tfoot id='AbeYH'></tfoot>
              <tbody id='AbeYH'></tbody>

                <i id='AbeYH'><tr id='AbeYH'><dt id='AbeYH'><q id='AbeYH'><span id='AbeYH'><b id='AbeYH'><form id='AbeYH'><ins id='AbeYH'></ins><ul id='AbeYH'></ul><sub id='AbeYH'></sub></form><legend id='AbeYH'></legend><bdo id='AbeYH'><pre id='AbeYH'><center id='AbeYH'></center></pre></bdo></b><th id='AbeYH'></th></span></q></dt></tr></i><div id='AbeYH'><tfoot id='AbeYH'></tfoot><dl id='AbeYH'><fieldset id='AbeYH'></fieldset></dl></div>

                  <bdo id='AbeYH'></bdo><ul id='AbeYH'></ul>
                  本文介绍了如何结合 std::bind()、可变参数模板和完美转发?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  限时送ChatGPT账号..

                  我想通过第三方函数调用另一个方法;但两者都使用可变参数模板.例如:

                  I want to invoke a method from another, through a third-party function; but both use variadic templates. For example:

                  void third_party(int n, std::function<void(int)> f)
                  {
                    f(n);
                  }
                  
                  struct foo
                  {
                    template <typename... Args>
                    void invoke(int n, Args&&... args)
                    {
                      auto bound = std::bind(&foo::invoke_impl<Args...>, this,
                                             std::placeholders::_1, std::forward<Args>(args)...);
                  
                      third_party(n, bound);
                    }
                  
                    template <typename... Args>
                    void invoke_impl(int, Args&&...)
                    {
                    }
                  };
                  
                  foo f;
                  f.invoke(1, 2);
                  

                  问题是,我收到一个编译错误:

                  Problem is, I get a compilation error:

                  /usr/include/c++/4.7/functional:1206:35: error: cannot bind ‘int’ lvalue to ‘int&&’
                  

                  我尝试使用 lambda,但 也许 GCC 4.8 还没有处理语法;这是我尝试过的:

                  I tried using a lambda, but maybe GCC 4.8 does not handle the syntax yet; here is what I tried:

                  auto bound = [this, &args...] (int k) { invoke_impl(k, std::foward<Args>(args)...); };
                  

                  我收到以下错误:

                  error: expected ‘,’ before ‘...’ token
                  error: expected identifier before ‘...’ token
                  error: parameter packs not expanded with ‘...’:
                  note:         ‘args’
                  

                  据我所知,编译器想要实例化 invoke_impl 类型为 int&&,而我认为使用 &&> 在这种情况下将保留实际参数类型.

                  From what I understand, the compiler wants to instantiate invoke_impl with type int&&, while I thought that using && in this case would preserve the actual argument type.

                  我做错了什么?谢谢,

                  推荐答案

                  Binding to &foo::invoke_impl<Args...> 将创建一个带有 的绑定函数Args&& 参数,表示右值.问题是传递的参数将是一个左值,因为参数被存储为某个内部类的成员函数.

                  Binding to &foo::invoke_impl<Args...> will create a bound function that takes an Args&& parameter, meaning an rvalue. The problem is that the parameter passed will be an lvalue because the argument is stored as a member function of some internal class.

                  要修复,通过将 &foo::invoke_impl<Args...> 更改为 &foo::invoke_impl<Args&...> 来利用引用折叠规则. 所以成员函数将采用左值.

                  To fix, utilize reference collapsing rules by changing &foo::invoke_impl<Args...> to &foo::invoke_impl<Args&...> so the member function will take an lvalue.

                  auto bound = std::bind(&foo::invoke_impl<Args&...>, this,
                                         std::placeholders::_1, std::forward<Args>(args)...);
                  

                  这是一个演示.

                  这篇关于如何结合 std::bind()、可变参数模板和完美转发?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:检查是否在可变参数模板参数包中传递了类型 下一篇:本地类型作为 C++ 中的模板参数

                  相关文章

                  最新文章

                  <tfoot id='gk9ix'></tfoot>
                • <i id='gk9ix'><tr id='gk9ix'><dt id='gk9ix'><q id='gk9ix'><span id='gk9ix'><b id='gk9ix'><form id='gk9ix'><ins id='gk9ix'></ins><ul id='gk9ix'></ul><sub id='gk9ix'></sub></form><legend id='gk9ix'></legend><bdo id='gk9ix'><pre id='gk9ix'><center id='gk9ix'></center></pre></bdo></b><th id='gk9ix'></th></span></q></dt></tr></i><div id='gk9ix'><tfoot id='gk9ix'></tfoot><dl id='gk9ix'><fieldset id='gk9ix'></fieldset></dl></div>
                  1. <legend id='gk9ix'><style id='gk9ix'><dir id='gk9ix'><q id='gk9ix'></q></dir></style></legend>
                      <bdo id='gk9ix'></bdo><ul id='gk9ix'></ul>

                      <small id='gk9ix'></small><noframes id='gk9ix'>