C++ 将对数组的可变数量的引用传递给具有可变模板的函数
我知道如何编写接受可变数量参数的可变模板函数:C++ 将对数组的可变数量的引用传递给具有可变模板的函数,c++,templates,c++11,variadic-templates,C++,Templates,C++11,Variadic Templates,我知道如何编写接受可变数量参数的可变模板函数: template<int I, typename... Rest> void f() { // whatever } 模板 void f(){ //随便 } 我知道如何编写一个模板函数来接受对数组的引用: template<typename T, unsigned int Length> void f(T(&arr)[Length]) { // whatever } 模板 空隙f(T和arr)[
template<int I, typename... Rest>
void f() {
// whatever
}
模板
void f(){
//随便
}
我知道如何编写一个模板函数来接受对数组的引用:
template<typename T, unsigned int Length>
void f(T(&arr)[Length]) {
// whatever
}
模板
空隙f(T和arr)[长度]){
//随便
}
但我想不出如何将两者结合起来,使函数接受对数组的可变数量的引用
我的第一次尝试是
template<typename T, unsigned int Length>
unsigned int arrlen(T(&)[Length]) {
return Length;
}
template<typename T, unsigned int Length>
int f(T(&arr)[Length]) {
return Length;
}
template<typename T, unsigned int Length, typename... Rest>
int f(T(&arr)[Length], Rest... rest) {
return Length + f(rest...);
}
int main() {
int a[] = {1 , 2, 3}, b[] = {1, 2, 3, 4, 5}, c[] = {1};
cout << f(a, b, c);
}
模板
无符号整数arrlen(T(&)[长度]){
返回长度;
}
模板
int f(T&arr)[长度]){
返回长度;
}
模板
int f(T(&arr)[长度],剩余…剩余){
返回长度+f(剩余…);
}
int main(){
int a[]={1,2,3},b[]={1,2,3,4,5},c[]={1};
cout如果您只想对多个数组的长度求和,可以直接这样做:
template<typename T, unsigned int Length>
int f(const T (&)[Length]) {
return Length;
}
template<typename T, unsigned int Length, typename... Args>
int f(const T (&)[Length], Args&... rest) {
return Length + f(rest...);
}
int main() {
int a[] = { 1, 2, 3 }, b[] = { 1, 2, 3, 4, 5 }, c[] = { 1 };
std::cout << f(a, b, c);
}
模板
整数f(常数T(&)[长度]){
返回长度;
}
模板
int f(常数T(&)[Length],参数和…rest){
返回长度+f(剩余…);
}
int main(){
int a[]={1,2,3},b[]={1,2,3,4,5},c[]={1};
std::cout您可以使用std::extent
获取数组外部维度的范围,并可变地将其相加:
#include <type_trait>
template <typename Arr, typename ...Rest> struct extent_sum
: std::integral_constant<std::size_t,
std::extent<T>::value + extent_sum<Rest...>::value> { };
template <typename T> struct extent_sum<T>
: std::integral_constant<std::size_t, std::extent<T>::value> { };
#包括
模板结构范围和
:std::积分_常数{};
模板结构范围和
:std::积分_常数{};
用法:
const std::size_t n = extent_sum<int[2], char[4], float[3], bool>::value;
const std::size\u t n=extent\u sum::value;
只需使用std::array
就可以了,忘记原始数组的胡说八道。@CatPlusPlus这是一个简单的解决方法,不会帮助我了解这里发生了什么。@CatPlusPlus,实际上这会带来同样的问题不,不会。std::array
不会衰减到指针,所以你不必使用作为模板传递的大小ate参数。@CatPlusPlus啊,你说得对,我忘了问题是由指向指针的数组衰变引起的,所以我唯一缺少的是Args
前面的&
?@SethCarnegie:后面,当然?@lightness racesinorbit取决于单词所面对的方向:)啊,那么愚蠢的错误。Args&
的意思是什么所有参数都是通过引用传递的,Args
意味着它们都是通过值传递的吗?@Seth:是的,但是Args&&
会根据每个参数引用折叠,因此在一般情况下,如果您希望同时支持右值和左值(此处不需要),最好使用这种方法.Kerrek,constexpr
可能是首选(从GCC 4.6 AFAIR开始):。
const std::size_t n = extent_sum<int[2], char[4], float[3], bool>::value;