Два дня назад я спросил о создании потоков для запуска нестатических методов классов с помощью Win32 API, и я почти получил решение, но что-то меня смущает, поэтому я задаю этот вопрос, прежде чем публиковать ответ в моем предыдущемвопрос.
Я пытаюсь использовать этот код для потоковой передачи функции с неизвестным типом возврата:
template <class R, R func() >
unsigned int usualfunc() {
func();
return 1;
}
template <class R>
int Start(R(*func)()) {
typedef decltype(&usualfunc<int, func>) D; // I get the error here , I can't get the address of the template function directly I need this
D p = &usualfunc<R, func>;
uintptr_t add = (uintptr_t)p;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
func();
return 1;
}
int main() {
Start(ltest);
}
Когда я пытаюсь скомпилировать приведенный выше код, я получаю:
ошибка 3556 'normalfunc': неверный аргумент для 'decltype'
Описание ошибки описано в MSDN:
Ошибка компилятора C3556
Тем не менее, я пробовал другой код до этого, и он прекрасно работает, но я не очень хорошо разбирался в синтаксисе:
template <class R, R func() >
unsigned int usualfunc() {
func();
return 1;
}
template <class R,R func()>
int Start() {
typedef decltype(&usualfunc<int, func>) D; // works well
D p = &usualfunc<R, func>;
uintptr_t add = (uintptr_t)p;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)add, 0, 0, 0);
func();
return 1;
}
int main() {
Start<int,ltest>(); // works
}
Я знаю, этого кода достаточно, но яЯ хотел бы использовать Start(ltest)
вместо Start<int,ltest>()
.
Примечание: никто не говорит, что я должен использовать функцию в качестве параметра в usualfunction
, я использую ее как параметр шаблона, потому что CreateThread()
не может передать функцию в качестве параметра.