C++ lamba 表达式不支持可变参数 args...

hzhxxx 2017-06-21 10:28:52
centos
gcc 4.8.5

下编译


// 支持类成员函数
template <typename Function, typename Self, typename... Args>
void add_task(const Function &func, Self *self, Args... args)
{
if (!_is_stop_threadpool)
{
//下面这句编译失败
//task_t task = [&func, &self, args...] { return (*self.*func)(args...); };
//decltype(iarr)

//换成这样的写法也不对,那如何获取到类名呢
using type = decltype (self);
std::function<void ()> task = std::bind(&type::func, self, args...);
add_task_impl(task);
}
}

class Test
{
public:
void print(const std::string &str, int i)
{
std::cout << "Test: " << str << ", i: " << i << std::endl;
}
};


//调用测试
Test t;
add_task(&Test::print, &t,str, i);


错误:‘func’不是‘type {aka Test*}’的成员
std::function<void ()> task = std::bind(&type::func, self, args...);
...全文
458 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2017-06-22
  • 打赏
  • 举报
回复
引用 5 楼 hzhxxx 的回复:
std::function<void()> task = std::bind(&func,self,args); thread_pool.cpp:100:68: 错误:参数包未能在‘...’中被展开: std::function<void()> task = std::bind(&func,self,args);
std::function<void()> task = std::bind(&func,self,args); => std::function<void()> task = std::bind(func, self, args...);
hzhxxx 2017-06-22
  • 打赏
  • 举报
回复
std::function<void()> task = std::bind(&func,self,args); thread_pool.cpp:100:68: 错误:参数包未能在‘...’中被展开: std::function<void()> task = std::bind(&func,self,args);
hzhxxx 2017-06-22
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
std::function<void ()> task = std::bind(&type::func, self, args...); ==> std::function<void()> task = std::bind(func, self, args...); task_t task = [&func, &self, args...] { return (*self.*func)(args...); }; 不知道你的 task_t 是怎么定义的, 这样是没问题的: std::function<void()> task = [&func, &self, args...] { return (*self.*func)(args...); };
std::function<void()> task = [&func, &self, args...] { return (*self.*func)(args...); }; 就是这句话有问题,应该是 lamba 不支持可变参数。 不知道是不是 gcc 4.8.5 还不能编译,还是怎么的。
hzhxxx 2017-06-22
  • 打赏
  • 举报
回复
using task_t = std::function<void()>;
hzhxxx 2017-06-22
  • 打赏
  • 举报
回复
具体代码见 http://blog.csdn.net/hzhxxx/article/details/73604442 通用线程池实现。
hzhxxx 2017-06-22
  • 打赏
  • 举报
回复
搞了个 gcc 5.4.0 ./configure --disable-multilib --prefix=/usr/local/gcc-5.4 --enable-languages=c,c++ --build=x86_64-redhat-linux --target=x86_64-redhat-linux 静态链接 libstdc++.a,可以了。 /usr/local/gcc-5.4/bin/g++ thread_pool.cpp -o thread_pool -std=gnu++11 -lpthread /usr/local/gcc-5.4/lib64/libstdc++.a
幻夢之葉 2017-06-21
  • 打赏
  • 举报
回复
std::function<void()> task = std::bind(func, self, args...); //func本身就是完整的一个成员函数类型了。你用了类型限定,那么func将不再用一个模板参数替代 或者 task_t task = [&func, &self, args...] { return (self->*func)(args...); };
www_adintr_com 2017-06-21
  • 打赏
  • 举报
回复
std::function<void ()> task = std::bind(&type::func, self, args...); ==> std::function<void()> task = std::bind(func, self, args...); task_t task = [&func, &self, args...] { return (*self.*func)(args...); }; 不知道你的 task_t 是怎么定义的, 这样是没问题的: std::function<void()> task = [&func, &self, args...] { return (*self.*func)(args...); };

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧