如何解决如何创建具有可变参数的函数的可调用函数指针?
我具有以下功能
template <typename... Args>
void func(Args&&... args){
// do stuff
}
我现在想创建一个函数指针,可以像函数本身一样使用可变参数列表进行调用。
template <typename... Args>
using Var_Func = void(*)(Args... args)
在这一点上,我被困住了。创建类型为Var_Func
的变量时,我必须提供模板的类型列表:
Var_Func<[List of types]> var_func_p = &func;
但是,这阻止了我使用真实的可变参数列表调用指针。我想要一个指针,它使我可以像真正的可变参数函数那样调用它,如下所示:
var_func_p("Test");
var_func_p(0.3,5);
var_func_p('c',"Another test",1.3,3);
我不知道该如何实现。有人可以帮我吗?
解决方法
func
实际上不是一个函数。这是一个模板,编译器可以在需要时使用它来创建新函数。
执行func(5)
时,编译器会创建一个名为func<int>
的函数,然后对其进行调用。当您执行func(5.0,'a')
时,编译器会创建一个名为func<double,char>
的函数,然后对其进行调用。这是两个完全不同的,不相关的函数,具有两种不同的类型。
您可以按照通常的方式创建指向func<int>
或func<double,char>
或func<>
或func<anything else>
的指针。但是您永远无法创建指向func
的指针,因为func
不是函数,它是编译器的指令。
简单地说,这是不可能的。
函数模板不是函数,而是函数的模板 –因此,在指定所需实例之前,它没有函数指针。此时,指针将固定为特定类型的特定数量的参数。
在C ++语言中,不可能将模板类型化为单个类型,例如可以传递并延迟实例化的指针。
也就是说,代码如下:
some_discrete_variadic_type x = var_func_1;
x(1);
x(1,"2");
x = var_func_2;
x(1);
x(1,"2");
这是不可能的,因为要使类型擦除有效,您必须将擦除规范化为固定数量的类型(在这种情况下,将是实例化)。
根据您要解决的问题,可能会有解决方法-尽管这可能需要更多信息。
如果您的使用受到更多限制-例如将功能传递给其他在编译时才知道的功能,则可以使用Functor对象,并将它们传递到函数模板中推论的地方。例如:
struct var_func
{
template <typename...Args>
auto operator()(Args&&...args) -> void
{
// do something
}
};
其中一个被调用的示例可能是:
template <typename T>
auto consume(T var_func_p) -> void
{
var_func_p("Test");
var_func_p(0.3,5);
var_func_p('c',"Another test",1.3,3);
}
int main()
{
consume(var_func{});
consume(some_other_var_func{});
}
请注意,在这种情况下,您不再传递函数模板。您正在传递一个静态对象var_func
,该对象包含一个作为函数模板的调用操作符(operator()
)。
赞:
template <typename... Args>
void func(Args&&... args){
// do stuff
}
template <typename... Args>
using f_ptr = void(*)(Args&&...);
int main() {
f_ptr<int,int> p = &func<int,int>;
p(3,1);
}
但是,指向func
的不同实例的指针不兼容。
但是,这阻止了我使用真实的可变参数列表调用指针。我想要一个指针,它使我可以像真正的可变参数函数那样调用它,如下所示:
您不能在func<double,double>
中存储指向f_ptr<int,int>
的指针。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。