繁体   English   中英

如何将任意数量的 arguments 传递给 C++ 模板 function?

[英]How to pass any number of arguments to C++ template function?

我有这个简单的 C++ 模板 function。 我需要将任意数量的任意类型的 arguments 传递给 Method,如下所示。 我该怎么做呢?

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 就是我上面提到的模板 function。

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的 object。 它可以是指针或引用, std::invoke会自动做正确的事情。

简单的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM