gpt4 book ai didi

c++ - 使用数据数组调用函数时的模板参数包扩展

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:17 24 4
gpt4 key购买 nike

尝试避免为 x 个参数重载我的函数。

//T.. Types,C Class,R Return type
template<typename R = void,class C,typename T1,typename T2>
R callClassFunction(C& classname,void (C::*func)(T1,T2), void** myd)
{
return (classname.*func)(*((T1*)myd[0]), *((T2*)myd[1]));
}

是否可以使用可变参数模板来做到这一点?

由于数据数组,我无法找出正确的语法。

最佳答案

这应该有效:

template <typename R, class C, typename... Ts, size_t... Is>
R impl(C& instance, R (C::*func)(Ts...), void** data, index_sequence<Is...>)
{
return (instance.*pmf)(*static_cast<Ts*>(data[Is])...);
}

template <typename R, class C, typename... Ts>
R callClassFunction(C& instance, R (C::*func)(Ts...), void** data)
{
return impl(instance, func, data, make_index_sequence<sizeof...(Ts)>{});
}

index_sequence 是 C++14 但可以在 C++11 中实现,你可以在 SO 上找到很多实现。

关键是,我们构建了这个整数序列,我们可以使用它们来索引您的 void*。该序列与 Ts 大小相同,因此我们可以将 TsIs 一起解包。

请注意,这仅适用于指向成员函数的非const 指针。对于指向 const 成员函数的指针,您需要再次执行此操作。

此外,如果成员函数采用引用,这将不太有效 - 您将需要一些稍微不同的操作。我将把它作为练习留给读者。

关于c++ - 使用数据数组调用函数时的模板参数包扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50823497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com