axc*_*tor 16 c++ templates iterator stl
我有一个模板函数,我想在其中生成一个未知类型的向量.我试图让它自动,但编译器说它是不允许的.
模板函数获取迭代器或指针,如后面的main函数中的测试程序中所示.如何解决问题?
template<class Iter>
auto my_func(Iter beg, Iter end)
{
if (beg == end)
throw domain_error("empty vector");
auto size = distance(beg, end);
vector<auto> temp(size); // <--HERE COMPILER SAYS CANNOT BE AUTO TYPE
copy(beg, end, temp->begin);
.
.
return ....
}
int main()
{
int bips[] = {3, 7, 0, 60, 17}; // Passing pointers of array
auto g = my_func(bips, bips + sizeof(bips) / sizeof(*bips));
vector<int> v = {10, 5, 4, 14}; // Passing iterators of a vector
auto h = my_func(v.begin(), v.end());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Edg*_*jān 43
你不能使用std::vector的auto.您可以使用std :: iterator_traits:
std::vector<typename std::iterator_traits<Iter>::value_type> temp(size);
Run Code Online (Sandbox Code Playgroud)
Vas*_*kin 32
如果你有一个兼容C++ 17的编译器,你可以从类模板参数推导中获益.
因此,除非您有特定的理由填充矢量std::copy,否则您可以编写如下代码:
template<class Iter>
auto my_func(Iter beg, Iter end)
{
if (beg == end)
throw domain_error("empty vector");
vector temp(beg, end);
// do the remaining stuff
return ....
}
Run Code Online (Sandbox Code Playgroud)
如果您的编译器没有此功能,那么我会投票支持
vector<typename iterator_traits<Iter>::value_type> temp(beg, end);
Run Code Online (Sandbox Code Playgroud)
就像乔纳森的回答一样
你可能正在寻找类似的东西
std::vector<typename std::remove_reference<decltype(*beg)>::type> temp(beg, end);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3568 次 |
| 最近记录: |