首页 > 解决方案 > 如何衰减所有可变参数模板参数?

问题描述

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

例如:

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

标签: c++variadic-templates

解决方案


模板参数推导template < typename... T > void foo( T... ts );总是会推导出“衰减”类型。(实际上, 的最初目标decay是执行通过值传递时获得的类型转换。)

当然,用户仍然可以显式编写foo<int&>(...). 如果您关心这些事情(墨菲/马基雅维利/等),astatic_assert就足够了:

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

推荐阅读