我不知道如何实现一个具有可变数量的相同类型参数的函数。
我写的微控制器有很少的堆栈和内存,所以我不能使用递归或STL(有异常的部分)。
有可能做这样的功能吗?
struct S{
int r1;
int r2;
};
template<S* s, int... args> fun(int arg1, int arg2);
它可以扩展成这样:
for(int arg:args){
s->r1+=7*arg;
}
调用示例:
S s;
const int mode=3, speed=1;
fun<&s,1,2,7,4>(mode,speed);
5条答案
按热度按时间j13ufse21#
在C20概念中,可变参数包中的所有参数都是相同类型可能是***必需的***。
不幸的是,在C20中,the standard library doesn't have a concept for all_same(只有
std::same_as
用于两种类型),但它可以很容易地定义:代码:https://godbolt.org/z/dH9t-N
注意在许多情况下,要求相同类型不是必需的,您可以改为要求所有参数具有***公共类型***。要基于 test if common type exists 要求公共类型,您可以具有以下概念:
代码:https://godbolt.org/z/5M6dLp
jjjwad0x2#
你可以通过fold expression(c17)和concepts(c20)特性轻松地做到这一点。
其概念如下所示:
如果希望它们是相同的类型,可以按如下方式使用:
如果希望函数采用特定类型,可以按以下方式使用:
gcxthw6b3#
我不知道如何实现一个具有可变数量的相同类型参数的函数。
相同类型的模板参数还是相同类型的普通函数参数?
第一种情况很简单(如果类型是模板值类型所允许的类型),与您编写的完全相同
如果你能用C++17,你可以用模板折叠来使用它们
或者在(C ++11/C ++14)之前以稍微复杂一点的方式
不幸的是,您可以使用编译时已知的整数调用这种类型的函数,因此,例如,不能使用变量
在这种情况下,您需要一个相同类型的普通函数参数的变元列表;不幸的是这有点复杂。
您可以创建模板参数的典型可变列表
通过SFINAE,强制所有
Args...
都被推导或解释为int
(见迈克尔·肯泽尔的回答)。不幸的是,这要求每个参数都是
int
类型,因此使用(例如)long int
调用func会产生编译错误显然,您可以放宽SFINAE条件,例如,所有
Args...
类型都可以转换(std::is_convertible
)为int
,但这并不完全需要开发一个接收可变数量的相同类型参数的函数。如果可以接受参数数量的上限(在下面的示例中为
64
),并且函数是method(可能是静态),您可以创建一个foo
类,该类包含一个接收零个int
的方法f()
、一个接收一个int
的f()
一个f()
接收两个int
,等等,直到一个f()
接收63个int
。下面是一个完整的C++17编译示例
在C14中要稍微复杂一点,因为没有可变变量
using
,所以你必须用递归的方式写foo
类。在C11中,你还必须开发
std::make_index_sequence
/std::index_sequence
的替代。6tqwzwtp4#
不幸的是,目前还没有办法指定一个每个参数都是相同类型的函数参数包,你能得到的下一个最好的东西(据我所知)是一个函数,它可以接受任意类型的可变数量的参数,只要它们的类型都是
int
:这里有一个示例
这里的技巧是依靠SFINAE来有效地删除函数的所有版本,其中并非所有的
args
最终都是int
类型...对于你的具体例子,你可以这样做,例如:
此处为现场演示
q8l4jmvw5#
包含多个参数的更详细的示例。
从这里的答案〉有没有一种方法可以定义相同类型的变元数参数?
更短的初始化(std::is_same_v)和使用〉的示例
一些有用的例子
对我来说,最好使用“init list”,我们可以看到size()函数,可以访问大量参数