gpt4 book ai didi

c++ - 具有不同类型的可选参数的调用函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:24:07 26 4
gpt4 key购买 nike

我正在尝试编写一个可以采用不同模板类型的可选参数的调用函数。

#include <iostream>
#include <string>

void f_int(int x){std::cout << "f_int\n";}
void f_double(double x){std::cout << "f_double\n";}
void f_void(void){std::cout << "f_void\n";}

template<typename T>
void caller(void (*fun)(T), T arg)
{
(*fun)(arg);
}


int main()
{
caller(f_int, 3);
caller(f_double, 2.1);
caller(f_void); // compilation error
caller(f_void, void); // compilation error
void* p;
caller(f_void, *p); // compilation error
}

在编写这段代码时,我希望 T 可以是 void 类型。是真的吗?如果是,为什么上面的代码不起作用? void 是有效类型还是只有 void* 是有效类型?

最佳答案

您可以使用 variadic template 完成大部分工作和 perfect forwarding :

template<typename F, class... Args>
void caller(F func, Args&&... args) {
func(std::forward<Args>(args)...);
}

//...

caller(f_int, 3);
caller(f_double, 2.1);
caller(f_void);

您还可以使用 auto 返回函数模板中被调用函数的值,即使被调用函数被声明为 void:

int f_int(int x) {
return x*2;
}
double f_double(double x) {
return x*1.5;
}
void f_void(void) {
std::cout << "f_void\n";
}

template<typename F, class... Args>
auto caller(F func, Args&&... args) { // note the "auto"
return func(std::forward<Args>(args)...); // and return
}

//...

auto rv1 = caller(f_int, 3);
auto rv2 = caller(f_double, 2.1);
caller(f_void); // you can't assign void though

关于c++ - 具有不同类型的可选参数的调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58531760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com