c++ - 如何衰减所有可变参数模板参数?
问题描述
有没有办法将变量模板参数包中的所有类型衰减为它们的值类型?
例如:
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
解决方案
模板参数推导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!");
推荐阅读
- git - 保留来自不同分支的文件变体的本地版本
- java - Printing Vertical Histogram to console
- javascript - 使用 onchange 方法的 Javascript 未捕获的 ReferenceError
- regex - Regex: Extract content between two strings using sed over multiple lines
- java - jsoup - 如何选择特定 h3 之后段落中的所有链接(也有 id 和 span 类)
- spring - Get the value of dropdown menu which is clicked in a webpage
- python - 我如何捕获帐户和日期字段数据并使用 python 将它们作为列包含在内
- php - 上传图片,调整大小,重命名并将其移动到目录
- sympy - 用其他类型替换 SymPy 符号 (Z3Py)
- python - 不工作:Spark 环境变量的编辑