c++ - 在编译时接受相同类型的参数并对其进行迭代的可变参数函数
问题描述
我正在寻找一种方法来实现 Variadic 函数,该函数在编译时接受相同类型的参数并且应该能够对其进行迭代。可变参数在最后,它们都具有相同的类型。像下面的东西 -
void SampleFunc(Other arguments(String may be)..., int... arg)
{
for (const auto& val : arg)
{
// Each argument available here.
}
}
然后我会像下面这样调用这个函数 -
SampleFunc("String", "{1,2,3,4})
最重要的是每次调用函数时可变参数都是硬编码的,所以我应该能够在编译时生成这个可变参数。
现在我正在接受如下所示的函数参数 -
void SampleFunc(std::string str, std::vector<int>& nums)
但这增加了每次调用函数时构建向量的运行时间成本,这是我想避免的。
更新 :-
我忘了提到这个函数在开始时还有其他参数。这是我的错,对此感到抱歉。我现在更新了我的例子。
解决方案
如果参数在编译时已知,在c++17中,使用折叠表达式可以执行类似的操作
#include <utility> // std::forward
template <typename Type>
void doSomething(Type&& arg) /* noexcept */
{
// Each argument available here.
std::cout << arg << "\n";
}
template <typename... Args>
void SampleFunc(Args&&... args) /* noexcept */
{
(doSomething(std::forward<Args>(args)), ...);
}
现在你可以像这样调用函数
SampleFunc(1, 2, 3, 4);
并且使用doSomething
你可以对每个参数做一些事情。
(在线观看演示)
在以前的编译器中,您可以通过扩展技巧模仿折叠表达式,如下所示
template <typename Type>
void doSomething(Type&& arg) /* noexcept */
{
// Each argument available here.
std::cout << arg << "\n";
}
template <typename... Args>
void SampleFunc(Args&&... args) /* noexcept */
{
using dummy = int[];
(void)dummy {
0, (doSomething(std::forward<Args>(args)), 0)...
};
}
(在线观看演示)
推荐阅读
- javascript - 如何修复 HasAttributes.php 中的 ErrorException
- ionic-framework - Ionic 4:我正在使用 Document Viewer 查看 pdf 文件。但它不工作
- android - 用于使用 Picasso 显示来自 URL 的图像的绑定适配器
- python - 我正在尝试创建一个对象,但应该工作的代码不起作用
- android-studio - 如果没有明确的 null 检查,编译器将无法识别不可为 null 的值
- html - CSS :active 仅在点击期间有效
- angular - 如何在离子的选项卡组件内路由
- sql - 如何在Group By sql中选择最小值行
- ef-code-first - 代码首先不运行所有迁移
- python - 选择性 Pandas dropna 使 DataFrame 的长度不同