c++ - 尝试将参数包的第一个元素作为函数调用并将包的其余部分作为参数传递给它

标签 c++ c++11 templates variadic-templates template-meta-programming

我必须编写一个具有以下接口(interface)的模板函数:

template <typename... Args>
void create(Args&&... args)

我需要能够这样调用它:

create([](int, float){}, 42, 5.f);

并且我希望函数 (lambda) 被调用并在其后传递 2 个参数。我怎样才能做到这一点?

我受限于 create() 的接口(interface) - 我不能分离参数包的函数参数 ouf 因为...原因(相信我)。也许它可以用一些技巧来提取,比如 here并将其余的参数包转发给它...?

这应该适用于接受任意数量参数的函数——而不仅仅是一个 int 和一个 float。

最佳答案

一个简单的解决方案是要求执行一个没有签名限制的辅助函数。

举例

#include <iostream>

template <typename L, typename ... Args>
void create_helper (L const & l, Args && ... args)
 { (void)l(args...); }

template <typename ... Args>
void create (Args && ... args)
 { create_helper(args...); }

int main()
 {
   create([](int i, float f){ std::cout << i << ", " << f << std::endl; },
          42, 5.f);
 }

关于c++ - 尝试将参数包的第一个元素作为函数调用并将包的其余部分作为参数传递给它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45063380/

相关文章:

python - 检查字符串的格式

c++ - 为什么这个模板函数原型(prototype)不能正常工作?

c++ - 有没有更好的方法来编写这个模板?

javascript - 将数据从html传递到QT

c++ - 使用 C++11 将数组设置为零

C++ 智能卡通信

c++ - 扫描位数组以获取多个位的模式

c++ - DLL 卸载后使用 std::weak_ptr

c++ - 如何在 OpenCV 中使用高斯过滤单列垫

c++ - 从文件C++按字母顺序排序