[英]C++ Getting a number of elements in variadic template
所以我試圖在我的可變參數模板中獲取一些元素,如下所示:
Test(const T& t...);
template<typename T>
inline Class<T>::Test(const T& t...){
int num = sizeof...(t);
...
}
但是它沒有編譯,我收到以下錯誤:
錯誤 C3523:“sizeof ...”需要一個未擴展的參數包作為其參數
't' 不是 'sizeof...' 的有效操作數。 你的意思是使用'sizeof'嗎?
獲取t...
中的參數數量的正確方法是什么?
嘗試std::tuple
元編程: std::tuple_size<std::tuple<Types...>>::value
產生類型參數的數量。 例如,此代碼打印4
:
#include <iostream>
#include <tuple>
#include <cstddef>
template<typename ...Types>
constexpr std::size_t Test(Types&& ... args){
constexpr std::size_t sz = std::tuple_size<std::tuple<Types...>>::value;
return sz;
}
int main()
{
std::size_t val = Test(0, 0L, 'a', std::cin);
std::cout << val;
}
如果T
是參數包,您可以使用以下語法聲明一個函數,該函數接受一系列參數,其類型對應於參數包中的參數:
inline Class<T>::Test(const T&... t) { /* ... */ }
但是,似乎T
不是參數包。 它只是一個單一的類型參數。 另外,您將...
放在錯誤的位置。 所以你真正做的是聲明一個函數,它接受一個T
類型的參數,加上一個 C 風格的省略號。 (是的,省略號前的逗號是可選的!)
因此,當您編寫sizeof...(t)
時,編譯器會抱怨,因為t
不是包。 這只是一個正常的參數。
也許您想將Test
聲明為一個接受任意數量參數的函數,但都是const T&
類型? 不幸的是,在當前的 C++ 中沒有簡單的方法可以做到這一點。 請參閱為使用數組、向量、結構等傳遞給可變參數函數或可變參數模板函數的所有參數指定一種類型? 為解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.