【问题标题】:How to decay all variadic template parameters?如何衰减所有可变参数模板参数?
【发布时间】:2018-10-25 03:20:37
【问题描述】:

有没有办法将变量模板参数包中的所有类型衰减为它们的值类型?

例如:

template < typename... T >
void foo( T... ts )    // I do not want to have references here
{
}
template < typename... T >
void bar( T&&... ts )
{
    foo( ts );
}

所以,我想做的是类似于std::decay,但在整个可变参数模板包上。该怎么做?

如果我这样调用这些函数:

struct A{
};
A a;
bar( 3, a, 5.5f );

然后我希望所有内容都被复制并按值传递给函数foo

PS:我的编译器是gcc 6.2.0,最高支持c++17

【问题讨论】:

  • std:decay_t&lt;T&gt;... ts 没有用吗?我假设你已经尝试过了。
  • 我很困惑。 foo(ts...); 已经复制了参数。
  • @T.C.那为什么不回答呢? void foo( T... ts ) 是否足以确保包中的所有类型都复制参数?有没有一种类型获得引用的情况?

标签: c++ variadic-templates


【解决方案1】:

template &lt; typename... T &gt; void foo( T... ts ); 的模板参数推导将始终推导出“衰减”类型。 (事实上​​,decay 的最初目标是执行通过值传递时得到的类型转换。)

当然,用户仍然可以显式写入foo&lt;int&amp;&gt;(...)。如果您关心这些事情(墨菲/马基雅维利/等),static_assert 就足够了:

static_assert((std::is_same_v<T, std::decay_t<T>> && ...), "Hello, Machiavelli!");

【讨论】:

  • 听起来不错,但我该把那个静态断言放在哪里呢?以及如何为可变参数包编写它?
  • @BЈовић 在foo 的正文中。而且我写的表格是可变的。
  • 当您说“衰减”类型时,是否包括数组到指针的转换?
  • 在 Godbolt 上进行了一些探索,看来确实如此。
  • 我还在学习新功能,可变参数模板一定是最疯狂的事情之一。 BTW std::is_same_v 不在我的 c++17 版本中,所以我使用了 std::is_same
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2014-09-08
相关资源
最近更新 更多