【发布时间】:2017-11-16 21:29:56
【问题描述】:
我需要调用一个具有 LPVOID 和参数数量的函数。此外,我知道论点的类型和位置。 参数可以是 int、int*、double、double*、string、string* 类型。 由于参数可以按任何顺序排列,因此可能的模板列表会非常大。返回值始终为布尔值。
bool Func1(int);
bool Func1(int*);
bool Func1(double);
(...)
bool Func2(int,int);
bool Func2(int,int*);
(...)
所以这不是一个选项。我尝试使用 std::tuple 但没有成功。 以下示例仅适用于带参数 (int, double) 的函数。
template <typename R, typename... Args>
R call(FARPROC fp, Args... args) throw(HRESULT)
{
typedef R(__stdcall * function_pointer)(Args...);
function_pointer P = (function_pointer)fp;
const auto return_value = (*P)(std::forward<Args>(args)...);
().do_cast(fetch_back(args))...);
return return_value;
}
(...)
LPVOID function;
int iVal1 = 2;
double dbVal1 = 3.0;
auto t = std::make_tuple(iVal1 , dbVal1);
bool bRes = call<bool>((FARPROC)function, std::get<0>(t), std::get<1>(t));
我正在考虑的是一种基于某些输入(字符串等)创建 std::tuple 的通用方法,例如:auto t = create_tuple("int,int*,int")。
【问题讨论】:
-
你知道元组也被模板化了,对吧?你可能无法用它规避代码大小的问题。
-
另外,如果你说输入字符串,你的意思是编译时输入还是运行时输入?
-
什么是LPVOID,你能解释一下吗?编辑:基本上是
void*? -
无论如何,我认为您的“代码膨胀”问题是没有根据的。您在函数体中的 typedef 和强制转换不会生成任何代码。函数体真正做的就是调用传递的函数指针,这是你无论如何都需要做的工作。在实践中,您可能会看到
call总是被内联(因为特定的模板序列只显示一次)并且只是一些额外的汇编行,无论如何您都需要!