繁体   English   中英

C ++不需要的类型演绎

[英]C++ unwanted type deduction

我有以下两个功能:

  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);

在我的main.cpp文件中,我创建了一个Task对象,为它分配了一个函数并将其推送到我的调度程序中。 runAt是调度程序的功能。

这是代码:

... // Task initialization
scheduler.runAt(task, std::chrono::steady_clock::now());

问题是调用模板化函数而不是以Task作为参数的函数。 我知道这两个函数都是有效的,因为第一个参数是模板化的,并且可变参数对象是空的。

我有两个问题:

1)如何调用第二种方法(考虑返回类型不一样)

2)不是很重要,但我很想知道在编译过程中这不会失败

  auto packagedTask = std::make_shared<std::packaged_task<return_type()> >
    (std::bind(std::forward<F>(function), std::forward<Args>(args)...));

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> {
  /* ... */
}

偶然,

auto packagedTask = std::make_shared<std::packaged_task<return_type()> >
(std::bind(std::forward<F>(function), std::forward<Args>(args)...));

是不正确的。 bind对嵌套的绑定和占位符进行特殊处理,因为你计算了返回类型为typename std::result_of<F(Args...)>::type

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM