如何将任意数量的参数传递给C++模板函数



我有一个简单的C++模板函数。我需要将任意数量的任何类型的参数传递给方法,如下所示。我该怎么做?

template <typename T1, typename T2, auto Method>
T1 * wrapObject()
{
T2 * obj = (*_asposeObj.*Method)(// I would like to pass arguments here);
...
}

这是一个C++20项目,编译器是g++。

我试过了:

template <typename T1, typename T2, auto Method, auto ...Args>
T1 * wrapObject(Args... args)
{
T2 * obj = (*_asposeObj.*Method)(&args);
...
}

但这不会编译。有什么想法吗?

编辑:

感谢所有的帮助,它现在起作用了!

然而,还有另一个相关的问题:如果asposeObj中有两个版本的Method怎么办?类似:

asposeObj->idx_get(int index);
asposeObj->idx_get(someObj);

编译器似乎无法确定要调用哪一个,我得到了";无法从中推断"auto"错误。

如何修改以下调用以使其工作?wrapObject是我上面提到的模板函数。

wrapObject<SomeClass, AnotherClass, &ClassAsposeOj::idx_get>(index)

可能是您没有以正确的方式使用参数包。

正确用法:

template <typename T1, typename T2, auto Method, class ...Args>
T1 * wrapObject(Args &&... args)
{
T2 * obj = (*_asposeObj.*Method)(args...);
...
}

完美转发:

template <typename T1, typename T2, auto Method, class ...Args>
T1 * wrapObject(Args &&... args)
{
T2 * obj = (*_asposeObj.*Method)(std::forward<Args>(args)...);
...
}

了解更多信息:使用std::forward的主要目的是什么?它解决了哪些问题?

您可以使用std::invoke来简化调用语法:

template<typename T1, typename T2, auto Method, typename... Args>
T1* wrapObject(Args... args) {
// ...
T2* obj = std::invoke(Method, _asposeObj, args...);  // std::forward, if needed
}

std::invoke的第二个参数是您对其调用Method的对象。它可以是指针或引用,std::invoke会自动执行正确的操作。

简单的演示

相关内容

  • 没有找到相关文章

最新更新