首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在保持单个参数的同时传递变量参数列表

如何在保持单个参数的同时传递变量参数列表
EN

Stack Overflow用户
提问于 2015-02-03 03:20:11
回答 2查看 646关注 0票数 3

假设我有一个基类,这个基类以后可能通过派生得到“扩展”,让我们调用这个类Base和扩展Derived类的模板签名是固定的,不能更改(即。我们不能将模板参数更改为类)。Derived类的作者对Base一无所知,只知道它可能会给构造函数取一些参数。

但是,最终派生类的调用方知道应该传递多少参数。如何编写这个Derived扩展?以下是我所拥有的:

代码语言:javascript
复制
struct Base
{
    Base(int baseArg) {}
};

struct Derived : public Base
{
    template <typename... Args>
    Derived(Args&&... args, int derivedArg)
    :
        Base(std::forward<Args>(args)...)
    {
    }
};

当我尝试使用运行这个使用Derived d(1, 1);时,我会得到以下erorr消息:

代码语言:javascript
复制
prog.cpp: In function 'int main()':
prog.cpp:19:16: error: no matching function for call to 'Derived::Derived(int, int)'
  Derived d(1, 1);
                ^
prog.cpp:19:16: note: candidates are:
prog.cpp:11:2: note: template<class ... Args> Derived::Derived(Args&& ..., int)
  Derived(Args&&... args, int myArg)
  ^
prog.cpp:11:2: note:   template argument deduction/substitution failed:
prog.cpp:19:16: note:   candidate expects 1 argument, 2 provided
  Derived d(1, 1);
                ^
prog.cpp:8:8: note: constexpr Derived::Derived(const Derived&)
 struct Derived : public Base
        ^
prog.cpp:8:8: note:   candidate expects 1 argument, 2 provided
prog.cpp:8:8: note: constexpr Derived::Derived(Derived&&)
prog.cpp:8:8: note:   candidate expects 1 argument, 2 provided

Derived的构造函数应该使用2个参数,使用第一个参数来构造自身,并将第二个参数传递给基类。为什么这个不行?

EN

Stack Overflow用户

发布于 2015-02-03 03:53:45

nth获取某些参数的第n个元素:

代码语言:javascript
复制
template<size_t n, class...Args>
auto nth( Args&&... args )
->typename std::tuple_element<n,std::tuple<Args&&...>>::type
{
  return std::get<n>( std::forward_as_tuple(std::forward<Args>(args)...) );
}

这将使用上面的方法提取最后一个参数,并将它们发送到适当的位置:

代码语言:javascript
复制
struct Derived : public Base {
  struct tag{};
  template <typename... Args>
  Derived(Args&&... args) : Derived(
    tag{},
    std::make_index_sequence<sizeof...(Args)-1>{},
    std::forward<Args>(args)...
  ){}
  template<size_t...Is, class...Args>
  Derived(tag, std::index_sequence<Is...>, Args&&...args ):
    Base(nth<Is>(std::forward<Args>(args)...)...)
  {
    int derivedArg = nth<sizeof...(Args)-1>(std::forward<Args>(args)...);
  }
};

我们为第一个n-1元素构建一个序列,将它们传递给基本元素,并为自己存储最后一个元素。

然而,如果你把额外的论点放在第一位,那就容易多了。

票数 6
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28290792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档