【发布时间】:2019-03-12 15:03:37
【问题描述】:
如果我有一个带有可变参数的函数,其中一个是回调函数,那么绑定函数将如何工作? 当前实现如下:
template <typename... Args>
bool CallWithArgs(std::function<void (String&, Args... args)> cbk, Args... args)
{ .... }
上面的函数正在使用未来从一个单独的类中调用:
bool value = true;
auto f1 = std::bind(&CallWithArgs, rawPtr, _1, _2);
std::future<bool> fut = std::async(f1, cbk, value);
fut.wait();
是否有在 std::bind 函数的占位符中表示变量参数?当前实现遇到编译问题。
note: template<class _Func, class ... _BoundArgs> typename std::_Bind_helper<std::__or_<std::is_integral<typename std::decay<_Tp>::type>, std::is_enum<typename std::decay<_Tp>::type> >::value, _Func, _BoundArgs ...>::type std::bind(_Func&&, _BoundArgs&& ...)
bind(_Func&& __f, _BoundArgs&&... __args)
note: template argument deduction/substitution failed:
note: couldn't deduce template parameter ‘_Func’
【问题讨论】:
-
您是否考虑过使用 lambda 代替? (再想一想:你可能需要 C++14)
-
这是一个纯粹的学术问题,还是您试图让某些东西发挥作用?如果是后者,答案很简单:只需使用 lambda。
-
我正在尝试让某些东西正常工作。使用 lambda 的唯一问题是带有变量 args 的函数是公共库的一部分。所以把它变成一个 lambda 并将它放在我调用它的类中是不可行的。
-
@PK17 我不清楚为什么将 lambda 放在一个类中不如
std::bind可行。 -
@eerorika 正如我提到的,CallWithArgs fn 是公共库的一部分,需要访问该公共库中的其他函数/变量。我计划进一步允许支持从其他组件/可执行文件调用该函数。不希望每个组件都实现与 lambda 函数相同的 fn CallWithArgs。
标签: c++ c++11 variadic-functions stdbind