2015-09-01 5 views
3

У меня есть две следующих функции:C++ нежелательного типа вычет

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

Проблема заключается в том, что шаблонный функция вызывается вместо одного, принимая задачу в качестве параметра. Я понимаю, что обе функции действительны, поскольку первый параметр является шаблоном, а объект вариационного аргумента пуст.

У меня есть два вопроса:

1) Как называют второй метод (считают, что возвращаемые типы не совпадают)

2) Не очень важно, но мне интересно знать, как это не терпит неудачу во время компиляции

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

Эти две функции имеют разные имена: 'runTaskAt' и' runAt'. – wilx

+0

'runTask' и' runTaskAt' не перегружают. Они имеют то же имя в вашем коде? – 0x499602D2

+0

Извините, я только что изменил имена, прежде чем писать сообщение, я редактирую свой пост – Luc

ответ

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.

+0

Спасибо, это именно то, что я ожидал – Luc

Смежные вопросы