[英]How to use fold expression to instantiate each type in a variadic template 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;
typename... T
而不是typename T...
。x
獲取類型,然后從中獲取value_type
,例如typename decltype(x)::value_type
。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),...);;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.