![](/img/trans.png)
[英]STL-Container styles and iterators that point to a specific type (C++)
[英]Templating a function to deduce the return type stl-container from input arguments
我有一個函數,目標是獲取特定數據類型的stl容器並返回不同特定數據類型的相同stl容器。 見下文:
template <
template <typename, typename = std::allocator<double> > class ReturnContainer,
template <typename, typename = std::allocator<int> > class Container
>
inline ReturnContainer<double> transform(const Container<int>& container)
{
ReturnContainer<double> ret(container.size());
for(size_t i = 0; i < container.size(); ++i)
{
// Do something here
}
return ret;
}
您可以將其用作:
//
// Using vectors
//
std::vector<int> data_vector_in;
data_vector_in.push_back(0.0);
data_vector_in.push_back(1.0);
std::vector<double> data_vector_out = transform<std::vector>(data_vector_in);
//
// Using lists
//
std::list<int> data_list_in;
data_list_in.push_back(0.0);
data_list_in.push_back(1.0);
std::list<double> data_list_out = transform<std::list>(data_list_in);
一個人(或一個人)如何寫這個,以便可以從輸入容器中推斷出返回容器?
std::vector<double> data_vector_out = transform(data_vector_in); // No <std::vector>
盡管此問題的實質類似於返回轉換后的容器的類似於std :: transform的函數 ,但最流行的解決方案是針對模板元編程,我需要特別避免。 使用可變參數模板參數的解決方案解決了此問題。
我之所以回答,是因為似乎人們在評論中所做的暗示沒有幫助您。
對於具有單個類型的矢量容器(例如, vector
和list
,而不是map
)(例如, vector<int>
),您可以接受可變參數模板模板參數來匹配容器,但是您還必須記住這些容器的模板定義通常包含類型以外的內容。 例如,一個分配器(很少使用,但允許您對內存分配進行一些控制)。
我們經常忘記Allocator
等,因為這些通常是默認的。
這是您的新界面:
template <template<class...> class Container, class... Args>
Container<double> transform(const Container<int, Args...>& container);
您明確地知道要匹配一個int
容器並將其轉換為double
容器,因此我在此處進行了復制。
Args...
將匹配分配器(以及類型之后的任何其他模板參數)。 我們可以忽略在返回類型中指定Allocator的原因,因為回憶起它和它后面的其他參數通常是默認的。
現在您可以這樣稱呼它:
// Using vectors
std::vector<int> data_vector_in{0, 1};
auto data_vector_out = transform(data_vector_in);
// ensure we got the right type back
static_assert(std::is_same<decltype(data_vector_out), std::vector<double>>::value, "Err");
// Using lists
std::list<int> data_list_in{0, 1};
auto data_list_out = transform(data_list_in);
static_assert(std::is_same<decltype(data_list_out), std::list<double>>::value, "Err");
為什么不只使用構造函數?
std::vector<int> data_vector_in;
std::vector<double> data_vector_out(data_vector_in.begin(), data_vector_in.end());
std::list<int> data_list_in;
std::list<double> data_list_out(data_list_in.begin(), data_list_in.end());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.