Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 参数包中的参数计数?是否有一个C++;0x std lib函数是否用于此?_C++_Templates_C++11_Std_Variadic - Fatal编程技术网

C++ 参数包中的参数计数?是否有一个C++;0x std lib函数是否用于此?

C++ 参数包中的参数计数?是否有一个C++;0x std lib函数是否用于此?,c++,templates,c++11,std,variadic,C++,Templates,C++11,Std,Variadic,我只是想知道C++0x std库中是否已经有任何东西可以用来计算参数包中的参数数量?我想去掉下面代码中的字段计数。我知道我可以构建自己的计数器,但这似乎是C++0x std库中包含的一件显而易见的事情,我想确定它还没有出现:)自制的计数器实现也是最受欢迎的 template<const int field_count, typename... Args> struct Entity { const tuple<Args...> data; const ar

我只是想知道C++0x std库中是否已经有任何东西可以用来计算参数包中的参数数量?我想去掉下面代码中的字段计数。我知道我可以构建自己的计数器,但这似乎是C++0x std库中包含的一件显而易见的事情,我想确定它还没有出现:)自制的计数器实现也是最受欢迎的

template<const int field_count, typename... Args> struct Entity {
    const tuple<Args...> data;
    const array<const char*, field_count> source_names;

    Entity() : data() {
    }
};
模板结构实体{
常量元组数据;
常量数组源名称;
实体():数据(){
}
};
以下是一些可能对您有所帮助的信息。链接中的示例源:

template<typename... Args> struct count;

template<>
struct count<> {
    static const int value = 0;
};

template<typename T, typename... Args>
struct count<T, Args...> {
    static const int value = 1 + count<Args...>::value;
};
模板结构计数;
模板
结构计数{
静态常量int值=0;
};
模板
结构计数{
静态常量int value=1+count::value;
};

是的,您可以使用
sizeof…
。从C++0x FCD(§5.3.3/5)中:

sizeof…
表达式中的标识符应命名参数包。
sizeof…
运算符生成为参数包标识符提供的参数数。参数包由
sizeof…
运算符展开(14.5.3)。[示例:

模板
结构计数{
静态常数std::size\u t value=sizeof…(类型);
};
-[结束示例]


我喜欢这样使用sizeof,但现在我很好奇/谨慎。通常,我希望sizeof返回字节数,但在这里,它为我解包并计算参数。对于数组,典型的sizeof将给出数组的大小(以字节为单位)。使用sizeof…,是否有人需要注意“gotchas”。。。?我不太擅长W/C++,但在使用SigeOf来计算事物而不是实际的字节大小方面,我有点不太清楚。我只是在语义上有点偏执吗?lol.@pheadbaq:您只能在参数包上使用
sizeof…
,并且它总是返回包中的参数数。我认为它的使用没有太大的错误空间,但我明白你的意思。就个人而言,我认为,
sizeof…
是对
sizeof
关键字的荒谬滥用,但是,我不编写语言,我只是使用它。:-)请注意
sizeof…(类型)
sizeof(类型)…
的区别。后者是计数字节,前者是计数类型:)@Johannes:In
sizeof(types).
,参数包被展开,并且
sizeof
应用于参数包中的每个类型,对吗?多个
sizeof
表达式的结果如何组合?大小是否合计?14.5.3/6只是说使用了“列表中语法上合适的分隔符”。@当然,这取决于它的解包位置
f(sizeof(Types)…
将其解压到
初始值设定项列表中(假设
f
是一个取整数的函数),语法上合适的分隔符是
(逗号)。它不会生成单个整数:)在本例中,
sizeof(Types)
是一种模式,就像
f(Types()…)
将是一个模式的解包,导致传递大量的值构造对象。重复的我知道我从这里的一个答案中了解到的
sizeof…
。我在发布这个问题之前确实读过这个问题,但根据我的粗略阅读,我不确定他们得到的是参数的实际数量与所有参数的总大小。哈哈,我更喜欢我的问题,对我来说更清楚:)链接不再起作用了,为什么要在计数中加1?这是一种典型的技术,用函数式语言对列表中的项目进行计数,在这种技术中,你不能增加计数器,因为一切都是不可变的,每次“迭代”都会创建新的变量/实例。这是一个递归调用,每次调用都会计算参数列表中的第一个参数/类型T,然后将剩余的参数(不带T)传递给下一个递归调用;当没有留下任何类型并且第一个专门化匹配时,递归停止,返回0。这一切都发生在编译时,静态成员count::value将包含参数包中元素的nr。
template<class... Types>
struct count {
    static const std::size_t value = sizeof...(Types);
};