[英]C++ template constructor for iterators
我想創建不同類型的容器,並想用我的SortedContainer類對它們進行排序。 (我現在不想使用類似std :: sort()的函數)。
std::deque<int> d; d.push_back(2); d.push_back(1);
SortedContainer<int> sc1(d.begin(), d.end());
在SortedContainer類中,我想創建一個復制構造函數,該構造函數處理容器的迭代器(d.begin()和d.end())。
但是,如果我創建另一種STL容器,我也想這樣做。
std::vector<int> v; v.push_back(2); d.push_back(1);
SortedContainer<int> sc2(v.begin(), v.end());
在這種情況下,我使用的是std :: vector而不是std :: deque。 因此,基本上,它將是模板構造函數。
template <class T>
class SortedContainer
{
//...
public:
SortedContainer(template_iterator begin, template_iterator end)
{
//...
}
};
我知道如果我將class template_iterator添加為模板參數,它將很好地工作。
SortedContainer<int, std::deque::const_iterator> sc1(d.begin(), d.end());
但是我不想在實例化SortedContainer類時告訴容器的類型。 我想在將container.begin()和container.end()傳遞給其構造函數時發現它。
我已經嘗試過使用std :: function和其他方法,但是它們都不起作用。
可以將函數設為模板,而不是將模板添加到類中。
template <class T, class template_iterator>
class SortedContainer
{
//...
public:
SortedContainer(template_iterator begin, template_iterator end)
{
//...
}
};
變
template <class T>
class SortedContainer
{
//...
public:
template <typename Iterator>
SortedContainer(Iterator begin, Iterator end)
{
//...
}
};
因此,現在該函數將排除任何類型,但您使用名稱Iterator
來自我證明該類型應為迭代器。 請注意,由於這是一個構造好的SOP,因此應將其與SFINAE一起使用,因此它不會過於寬泛。
您可以創建一個make_sorted_container
函數來為您做推論:
template <typename TContainer>
auto make_sorted_container(TContainer&& c)
{
using element_type = std::decay_t<decltype(*std::begin(c))>;
using iterator_type = decltype(std::begin(c));
return SortedContainer<element_type, iterator_type>(std::begin(c), std::end(c));
}
可以如下使用:
std::vector<int> v;
auto sv = make_sorted_container(v);
static_assert(std::is_same<
decltype(sv),
SortedContainer<int, typename std::vector<int>::iterator>
>{});
在C ++ 17中, 類模板推導將允許構造函數推導模板參數。 在這種情況下,您需要一個演繹指南 :
template <class T, class TItr>
class SortedContainer
{
//...
public:
SortedContainer(TItr b, TItr e)
{
//...
}
};
// Deduction guide:
template <class TItr>
SortedContainer(TItr b, TItr e)
-> SortedContainer<std::decay_t<decltype(*b)>, TItr>;
可以這樣使用:
std::vector<int> v;
SortedContainer sv(v.begin(), v.end());
我將假設已排序容器的內部已排序表示形式不取決於用於初始化它的容器的類型。 然后,您需要做的只是模板構造器:
template <typename Iter>
SortedContainer(Iter first, Iter last)
{
//...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.