Luc*_*Luc 3 c++ templates c++11 c++14
我有以下两个功能:
template<class F, class... Args>
auto runAt(F&& function, const std::chrono::steady_clock::time_point& timePoint, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type> {
using return_type = typename std::result_of<F(Args...)>::type;
std::future<return_type> futureResult;
auto packagedTask = std::make_shared<std::packaged_task<return_type()> >
(std::bind(std::forward<F>(function), std::forward<Args>(args)...));
futureResult = packagedTask->get_future();
this->addTask(Task([this, packagedTask]() {
(*packagedTask)();
}), timePoint);
return futureResult;
}
void runAt(const Task& task,
const std::chrono::steady_clock::time_point& timePoint);
Run Code Online (Sandbox Code Playgroud)
在我的main.cpp文件中,我创建了一个Task对象,为它分配了一个函数并将其推送到我的调度程序中.runAt是调度程序的功能.
这是代码:
... // Task initialization
scheduler.runAt(task, std::chrono::steady_clock::now());
Run Code Online (Sandbox Code Playgroud)
问题是调用模板化函数而不是以Task作为参数的函数.我知道这两个函数都是有效的,因为第一个参数是模板化的,并且可变参数对象是空的.
我有两个问题:
1)如何调用第二种方法(考虑返回类型不一样)
2)不是很重要,但我很想知道在编译过程中这不会失败
auto packagedTask = std::make_shared<std::packaged_task<return_type()> >
(std::bind(std::forward<F>(function), std::forward<Args>(args)...));
Run Code Online (Sandbox Code Playgroud)
1)如何调用第二种方法(考虑返回类型不一样)
限制第一个.
template<class F, class... Args,
class = std::enable_if_t<!std::is_same<std::decay_t<F>, Task>{}>>
auto runAt(F&& function, const std::chrono::steady_clock::time_point& timePoint,
Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type> {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
偶然,
auto packagedTask = std::make_shared<std::packaged_task<return_type()> >
(std::bind(std::forward<F>(function), std::forward<Args>(args)...));
Run Code Online (Sandbox Code Playgroud)
是不正确的.bind
对嵌套的绑定和占位符进行特殊处理,这是您不想要的,因为您计算了返回类型typename std::result_of<F(Args...)>::type
.
归档时间: |
|
查看次数: |
231 次 |
最近记录: |