簡體   English   中英

模板化函數以根據輸入參數推斷出返回類型stl-container

[英]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的函數 ,但最流行的解決方案是針對模板元編程,我需要特別避免。 使用可變參數模板參數的解決方案解決了此問題。

我之所以回答,是因為似乎人們在評論中所做的暗示沒有幫助您。

對於具有單個類型的矢量容器(例如, vectorlist ,而不是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");

現場演示 (C ++ 14)

為什么不只使用構造函數?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM