簡體   English   中英

如何獲取傳遞給可變參數模板function的每個容器的元素類型

[英]How to get the element type of each container passed to variadic template function

我有一個可變參數模板 function 並且我將一系列std::vector s 傳遞給它。 對於每個std::vector object 我需要獲取其元素的類型,以便對其進行一些操作,例如檢索編譯時間常數 ex T::SIZE ,或檢查其大小sizeof(T) 這是我嘗試的兩種方法:

template<typename T...>
void foo(std::vector<T>...args) {
     auto f = [](auto x){
          size_t size = sizeof(T);
          int var = T::SIZE;
     };
     (f(args),...);;
 }

 template<typename T...>
 void foo(T...args) {
     auto f = [](auto x){
          using U = typename x.value_type;
          size_t size = sizeof(U);
          int var = U::SIZE;
     };
     (f(args),...);;
}

使用第二種方法,我嘗試將std::vector的類型抽象出來,而是使用std::vector::value_type方法獲取類型。

然后我傳遞值:

std::vector<A>a;
std::vector<B>b;
std::vector<C>c;
foo(a, b, c);

使用第一種方法,編譯器給了我:

error: parameter packs not expanded with ‘...’: auto f = ...

使用第二種方法,我得到:

error: expected nested-name-specifier before ‘x’ using U = typename x.value_type;
  1. 模板參數應聲明為typename... T而不是typename T...
  2. 您應該從參數x獲取類型,然后從中獲取value_type ,例如typename decltype(x)::value_type
  3. 在第一種情況下,您也應該從參數x中獲取信息,與第二種情況類似。

與第一個,

template<typename... T>
void foo(std::vector<T>...args) {
     auto f = [](auto x){
          using U = typename decltype(x)::value_type;
          int size = sizeof(U);
          int var = U::VAR;
     };
     (f(args),...);;
}

第2個:

template<typename... T>
void foo(T...args) {
     auto f = [](auto x){
          using U = typename decltype(x)::value_type;
          int size = sizeof(U);
          int var = U::VAR;
     };
     (f(args),...);;
}

居住

您必須執行以下操作:

template<typename ...T>
void foo(T...args) {
     auto f = [](auto x){
          using U = typename decltype(x)::value_type;
          int size = sizeof(U);
          int var = sizeof(U);
     };
     (f(args),...);;
}

如果稍后您想更改 lambda 以接受引用,例如f = [](auto&& x) ,則必須使用std::decay_t ,因為decltype(x)將為您提供引用類型,並且引用類型沒有任何嵌套類型成員:

template<typename ...T>
void foo(T...args) {
     auto f = [](auto&& x){
          using U = typename std::decay_t<decltype(x)>::value_type;
          int size = sizeof(U);
          int var = sizeof(U);
     };
     (f(args),...);;
}

示例: https://godbolt.org/z/fPr4Gh

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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