是否可以在没有显式专用化的情况下调用可变参数模板函数?
Is it possible to invoke a variadic template function without explicit specialization?
我试图编写一个函数来转发可变参数模板函数的参数,类似于std::invoke
。这是代码:
#include <functional>
template<class... Args>
void f(Args&&... args) { }
template<template<class...> class F, class... Args>
void invoke(F<Args...> f, Args&&... args) {
f(std::forward<decltype(args)>(args)...);
}
int main() {
invoke(f, 1, 2, 3);
std::invoke(f, 1, 2, 3);
}
但是,我的invoke
和std::invoke
都无法编译。 G++抱怨它无法推断出模板参数template<class ...> class F
。那么,是否可以在没有显式模板专用化的情况下调用可变参数模板函数呢?
请注意,函数模板表示一系列函数。例如,当您将其传递给函数时,它需要解析为模板的某种专用化。我理解您要尝试使用自定义invoke
的参数做什么(将函数模板捕获为模板(,但遗憾的是,这仅适用于类模板,而不适用于函数模板。
您需要另一个级别的间接寻址。即,传递一个函子或 lambda 将参数转发给f
:
invoke([](auto&&... xs) { f(decltype(xs)(xs)...); }, 1, 2, 3);
不同之处在于,现在参数是一个类非模板,因此可以通过您的invoke
推导出来。
随着此更改,您更改函数以完全推导第一个参数的额外要求:
template<class F, class... Args>
void invoke(F&& f, Args&&... args) {
f(forward<Args>(args)...);
}
如果函数包装在模板类中,那么您应该能够将此模板类作为模板模板参数传递:
#include <functional>
template<class... Args> struct Wrap
{
static void f(Args&&... args) { }
};
template<template<class...> class F, class... Args>
void invoke(Args&&... args) {
Wrap<Args...>::f(std::forward<Args>(args)...);
}
int main() {
invoke<Wrap>(1, 2, 3);
}
在线编译器
相关文章:
- 如何链接 DLL 以供 LoadLibrary() 使用(在 Windows 上的 C++ 中)并从调用 exe 导入变
- 调用参数排列不变函数 f(i++, i++)
- 访问并调用 std::function 的变体
- 我可以在输入BSTR变体上调用variantChangeType吗?
- 从C 调用Fortran子例程会产生非法参数值
- 是否有希望在std::变体上高效地调用一个公共基类方法
- 统一处理具有协变类型的函数指针(如何使用派生类型调用回调?
- 从c++调用lua函数时,如何使表和变量值保持不变
- C++构造函数调用变体
- boost变体对通用方法的简单调用
- 如何在c/c++中使函数调用之间的变量值持久化
- 斐波那契汇编x86的一个变体,不得不从c ++主方法调用它,有点丢失在几个部分
- 在调用基类构造函数之前修改构造函数参数值
- 是以前初始化的内存,保证在放置新调用后保持不变
- 注释函数的内容,但保持对函数的调用不变.编译器是否弄清楚不编译函数
- 当用gdb调试我的c++代码时,函数调用中的变量值是荒谬的
- 提升::变体 - "调用没有匹配函数"
- c++11:用向量的元素调用变差函数
- 变量值在没有scanf调用的情况下正在更改
- 在c++中对模板形参调用静态函数