C ++不需要的类型演绎

时间:2015-09-01 17:17:44

标签: 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);

在我的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 个答案:

答案 0 :(得分:5)

  

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