gpt4 book ai didi

C++ for 模板类的范围循环

转载 作者:行者123 更新时间:2023-12-05 09:04:52 26 4
gpt4 key购买 nike

我下面有一个模板类,它依赖于 2 个类 UT并为这两个类实现了迭代器函数(参见本文末尾)。

我可以使用迭代器遍历类的各个 vector ,
但我想知道是否可以使用 for range 循环语法而不是使用迭代器来做同样的事情。用类似的东西

for (auto x : myclass  <double>)
{
std::cout << x << std::endl ;
}

我知道它不起作用,但我找不到语法,如果有的话,预先感谢您的回答

#include<iostream> 
#include<string>
#include<vector>

template<class U,class T>
class MyClass
{
public:
MyClass(
const std::vector<U> & vect_u ,
const std::vector<T> & vect_t )
{
m_vect_u = vect_u;
m_vect_t = vect_t;
}

~MyClass(){}

// begin()
template<class Z>
typename std::enable_if<std::is_same<Z,T>::value, typename std::vector<Z>::iterator>::type
begin() noexcept { return m_vect_t.begin(); }
template<class Z>
typename std::enable_if<std::is_same<Z,U>::value, typename std::vector<Z>::iterator>::type
begin() noexcept { return m_vect_u.begin(); }
// end()
template<class Z>
typename std::enable_if<std::is_same<Z,T>::value, typename std::vector<Z>::iterator>::type
end() noexcept { return m_vect_t.end(); }
template<class Z>
typename std::enable_if<std::is_same<Z,U>::value, typename std::vector<Z>::iterator>::type
end() noexcept { return m_vect_u.end(); }
// cbegin()
template<class Z>
typename std::enable_if<std::is_same<Z,T>::value, typename std::vector<Z>::const_iterator>::type
cbegin() const noexcept { return m_vect_t.cbegin(); }
template<class Z>
typename std::enable_if<std::is_same<Z,U>::value, typename std::vector<Z>::const_iterator>::type
cbegin() const noexcept { return m_vect_u.cbegin(); }
// cend()
template<class Z>
typename std::enable_if<std::is_same<Z,T>::value, typename std::vector<Z>::const_iterator>::type
cend() const noexcept { return m_vect_t.cend(); }
template<class Z>
typename std::enable_if<std::is_same<Z,U>::value, typename std::vector<Z>::const_iterator>::type
cend() const noexcept { return m_vect_u.cend(); }

private:
std::vector<U> m_vect_u ;
std::vector<T> m_vect_t ;

};


int main()
{
std::vector<double> vect_double = {1.5,2.5,3.5} ;
std::vector<int> vect_int = {-1,-2,-3} ;
MyClass<double,int> myclass( vect_double, vect_int);

std::cout << "iteration over int" << std::endl ;
for(auto itr = myclass.begin<int>(); itr < myclass.end<int>() ; ++itr)
{
std::cout << *itr << std::endl ;
}

std::cout << "iteration over double" << std::endl ;
for(auto itr = myclass.begin<double>(); itr < myclass.end<double>() ; ++itr)
{
std::cout << *itr << std::endl ;
}

return 0 ;
}

最佳答案

您可以提供返回“范围”的函数(直接 std::vector 或包装器):

template <typename Z> // Or SFINAE or if constexpr or any other implementation
auto& getVector() { return std::get<std::vector<Z>&>(std::tie(m_vect_u, m_vect_t)); }

template <typename Z>
const auto& getVector() const { return std::get<const std::vector<Z>&>(std::tie(m_vect_u, m_vect_t)); }

然后

std::cout << "iteration over int" << std::endl ; 
for (auto e : myclass.getVector<int>())
{
std::cout << e << std::endl ;
}

Demo

关于C++ for 模板类的范围循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68031888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com