如何编写带参数包及其展开的函数指针?附类std::thread构造实现尝试
实现类似std::thread的构造器逻辑与参数包展开
你的尝试代码中函数声明的写法存在问题,void (*funptr)(Args)...并非正确的可变参数函数指针声明方式。要实现和std::thread一致的逻辑——接收可调用对象+对应参数并转发执行,以下是正确的实现方案:
通用实现(兼容所有可调用类型)
利用C++11引入的可变模板参数和完美转发,可以兼容函数指针、lambda、仿函数等所有可调用对象,和std::thread的设计逻辑完全对齐:
#include <utility> #include <iostream> // 核心函数:接收可调用对象与任意参数,转发执行 template<typename Func, typename... Args> void my_thread_like_func(Func&& func, Args&&... args) { // 展开参数包,完美转发参数给可调用对象 std::forward<Func>(func)(std::forward<Args>(args)...); } // 测试用例 void test_print(int num, const std::string& str) { std::cout << "Number: " << num << ", String: " << str << std::endl; } int main() { // 调用普通函数 my_thread_like_func(test_print, 2024, "Hello World"); // 调用lambda表达式 my_thread_like_func([](double pi){ std::cout << "PI: " << pi << std::endl; }, 3.14159); return 0; }
仅支持函数指针的实现(贴近你的初始尝试)
如果只需要支持函数指针类型,可将模板参数限定为函数指针的参数列表:
#include <iostream> template<typename... Args> void fun(void (*func_ptr)(Args...), Args&&... args) { // 直接展开参数包传递给函数指针 func_ptr(std::forward<Args>(args)...); } // 测试用例 void print_info(char c, bool flag) { std::cout << "Char: " << c << ", Flag: " << std::boolalpha << flag << std::endl; } int main() { fun(print_info, 'X', true); return 0; }
关键说明
- 完美转发:
std::forward用于保留参数的左值/右值属性,避免不必要的拷贝,和std::thread的参数传递行为一致。 - 参数包展开:
std::forward<Args>(args)...会将参数包中的每个元素依次展开,作为实参传递给目标可调用对象。
内容的提问来源于stack exchange,提问作者Tolisios
相关产品推荐
相关产品推荐

