2016-10-08 36 views
1

在下面的代码:Deduce std ::数组大小?

template<size_t N> 
int b(int q, const std::array<int, N>& types) 
{ 
    int r = q; 
    for (int t : types) 
    { 
     r = r + t; 
    } 
    return r; 
} 

int main() 
{ 
    b<2>(9, { 2,3 }); 
} 

我怎样才能避免在呼叫指定2至b N个?为什么不能自动推导出这种类型?没有它我得到的错误:

'b': no matching overloaded function found 'int b(int,const std::array &)': could not deduce template argument for 'N'

回答

2

模板参数演绎依赖于实际参数和形式参数之间的直接类型匹配。实际的参数是一个初始化列表。它不匹配array类型(最好它可以匹配std::array中的内部原始数组,但语言规则不支持)。

相反,你可以只使用原始阵列,即:

#include <stddef.h> 
#include <array> 

template<size_t N> 
int b(int q, int const (&types)[N]) 
{ 
    int r = q; 
    for (int t : types) 
    { 
     r = r + t; 
    } 
    return r; 
} 

int main() 
{ 
    b(9, { 2, 3 }); 
} 

或者,如果你不绝对需要N在编译时,你可以使用一个std::initializer_list

还有很多其他可能相关的方法(例如可变参数模板函数,或定义运算符来构建std::vector),但很难说什么会适合您的未公开目的。

+0

不好意思啊,我的目的就是要通过将针对结构的INT M型检查int数组,数组生似乎不错足够我无论如何正在做 – paulm

1

对于演绎std::array大小,你可以使用通用的Lambda表达式(C++ 14):

auto b = [](int q, const auto& types) { 
    int r = q; 
    for (int t : types) 
    { 
     r = r + t; 
    } 
    return r; 
}; 

int main() { 
    std::array<int, 2> arr = {{2,3}}; 
    b(9, arr); 
} 

std::make_array(它在图书馆基础TS)将通过编译器得到实现(或您将使用some own实现它),你会不会也需要通过施工时数组的大小,只需用

b(9, std::make_array(2,3)); 
+4

读者应该注意''auto'这里没有做任何普通'template'不能做的事情。这段代码的作用是因为实际参数的类型被指定为'std :: array',而不是因为'auto'。通过这个答案的'main',OP的'b'定义也可以工作。 –