如何衰减所有可变参数模板参数?

时间:2018-05-15 10:16:12

标签: c++ variadic-templates

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

例如:

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

1 个答案:

答案 0 :(得分:2)

template < typename... T > void foo( T... ts );的模板参数推断将总是推断出一个&#34;衰变的&#34;类型。 (实际上,decay的最初目标是执行按值传递内容时获得的类型转换。)

当然,用户仍然可以明确地写foo<int&>(...)。如果你关心这些事情(Murphy / Machiavelli /等),static_assert就足够了:

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