2015-12-20 3 views
1

Я пишу класс для достижения функции задачи. Вот мой код:C++ 11 асинхронное программирование с использованием шаблона

template<typename TType> 
class YHMTask 
{ 
public: 
    YHMTask() {}; 
    std::future<TType> mTask; 
}; 

template<typename T> 
YHMTask<T> YHMCreateTask(std::function<T()> func) 
{ 
    YHMTask<T> yhmTask; 
    yhmTask.mTask = std::async(func); 
    return yhmTask; 
} 

Если я не использовал шаблон в YHMCreateTask, я могу использовать его как это:

YHMCreateTask([]{return 12;}); 

Но когда я пишу эту функцию с помощью шаблона. отчет компилятора эта ошибка:

error C2672: 'YHMCreateTask': no matching overloaded function found 
error C2784: 'YHMTask<TType> YHMCreateTask(std::function<_Type(void)>)': could not deduce template argument for 'std::function<_Type(void)>' from 'main::<lambda_a66b482c6cd6dab7208879904592bde5>' 

Я должен использовать YHMCreateTask как это:

int TestFunc() 
{ 
    return 11; 
} 
... 
std::function<int(void)> funInt = TestFunc; 
auto taskNew = YHMCreateTask(funInt); 

Я хочу YHMCreateTask может быть использован как YHMCreateTask ([] {вернуться 12;}); Как мне это сделать?

+0

, относящиеся к [как к обращенным-а-лямбда-к-ан-stdfunction-используя -templates] (http://stackoverflow.com/questions/13358672/how-to-convert-a-lambda-to-an-stdfunction-using-templates) – Jarod42

ответ

2

Вы должны использовать что-то вроде:

template<typename F> 
auto YHMCreateTask(F func) 
-> YHMTask<decltype(func())> 
{ 
    YHMTask<decltype(func())> yhmTask; 
    yhmTask.mTask = std::async(func); 
    return yhmTask; 
} 

T не может быть выведено из lamdba построить std::function

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