如何将任意数量的参数传递给 C++ 模板函数?
How to pass any number of arguments to C++ template function?
我有这个简单的 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);
编译器似乎无法确定调用哪个,我收到“无法从...推断‘自动’”错误。
如何修改以下调用以使其工作? wrapObject就是我上面提到的模板函数
wrapObject<SomeClass, AnotherClass, &ClassAsposeOj::idx_get>(index)
可能是您没有正确使用parameter pack。
正确用法:
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)...);
...
}
了解更多:What are the main purposes of using std::forward and which problems it solves?
您可以使用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
会自动执行正确的操作。
我有这个简单的 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);
编译器似乎无法确定调用哪个,我收到“无法从...推断‘自动’”错误。
如何修改以下调用以使其工作? wrapObject就是我上面提到的模板函数
wrapObject<SomeClass, AnotherClass, &ClassAsposeOj::idx_get>(index)
可能是您没有正确使用parameter pack。
正确用法:
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)...);
...
}
了解更多:What are the main purposes of using std::forward and which problems it solves?
您可以使用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
会自动执行正确的操作。