【发布时间】:2011-12-28 21:52:51
【问题描述】:
我有这个助手类,我用它来调用需要静态 C 函数的代码的成员方法。这个特定的“版本”与 Windows LPTHREADROUTINE 回调兼容,将 DWORD (class::method) (void *) 函数作为参数,调用如下:
CreateThread(NULL, 0, runThreadFunction<SomeClass>, makeThreadInfo(&myClass, &SomeClass::ThreadFunction, NULL), 0, NULL);
我希望将整个事情变得通用,并且我知道可以使用新的 C++11 标准来完成,但我无法实现。
#pragma once
#include <stdafx.h>
template <typename C>
struct ThreadInfo
{
// we have an object
C* obj;
// and that object has a function that takes void* and returns DWORD, and so is suitable for a threadproc (except for it being a member function)
DWORD (C::* function)(void*);
// and we have any amount of extra data that we might need.
void* data;
// default copy c-tor, d-tor and operator= are fine
ThreadInfo(C* o, DWORD (C::*func)(void*), void* d) : obj(o), function(func), data(d)
{
}
};
template <typename C>
DWORD WINAPI RunThreadFunction(void* data)
{
shared_ptr<ThreadInfo<C> > ti((ThreadInfo<C>*)data);
//ThreadInfo<C>* ti = (ThreadInfo<C>*) data;
return ((ti->obj)->*(ti->function))(ti->data);
}
template <typename C>
void* MakeThreadInfo(C* o, DWORD (C::* f)(void*), void* d)
{
return (void*)new ThreadInfo<C>(o, f, d);
}
我尝试过将 MakeThreadInfo 函数的接口改成这样:
template <typename C, typename R, typename... P>
void* MakeThreadInfo(C* o, std::function<R(P&...)> f, void* d)
这似乎是要走的路,但我无法将这个值传递给上游。
这是我想要的:
给定一个带有方法 MyMethod 的类 MyClass,以及一个返回类型为 variable 的回调和一个或多个 variing types 的参数(最后一个是 @987654326 @),我怎样才能尽可能少地进行样板化,将 something 传递给回调,然后让它调用 MyClass::MyMethod。
举例说明:
typedef bool (*Callback1)(void *userData);
typedef int (*Callback2)(bool param, void *userData);
void TheirLibrary::Function1(Callback1 callback, void *userData);
void TheirLibrary::Function2(Callback2 callback, void *userData);
class MyClass
{
bool MyMethod1(void *userData);
int MyMethod2(bool someParam, void *userData);
void DoSomething()
{
Function1(CreateGenericCPointer(&MyClass::MyMethod1), &MyClass);
Function2(CreateGenericCPointer(&MyClass::MyMethod2), &MyClass);
}
}
CreateGenericCPointer 的有效实现是什么?
【问题讨论】:
-
使
MakeThreadInfo通用的目标是什么?你想支持函子吗? -
我想将它与具有十几种不同回调格式的 C 库结合使用。我不想为每个类都复制这个类,而是想修改它以自动为动态创建的回调推断正确的返回和参数类型。
-
你的意思是你想让
MakeThreadInfo为可能接受void*以外的参数并返回DWORDs 以外的东西的方法工作?请注意,SO 不是论坛,cmets 不用于讨论。澄清应该编辑到问题中。 -
@sbi:不,不是。查看我的编辑。
标签: c++ callback c++11 std-function generic-callback