You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写带参数包及其展开的函数指针?附类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:05:29