[英]C++ variadic template
我正在嘗試使用可變參數模板創建一個多容器容器。 容器初始化為
container<tag, std::string, int, int, int> m;
我想使用以下語法:
auto& v2 = m.find<2, 3, 4>(255, 0, 0);
模板參數將指定“列”,對於參數,我希望編譯器期望使用適當的類型。
對於一個模板參數( find<2>(255)
),我使用了:
template < int idx > const typename value_type &
find( const typename std::tuple_element<idx, typename value_type>::type &key) {
const std::size_t row_id = getId<idx>(key);
return data_.at(row_id);
}
效果很好,所以我想擴展它如下:
template<int ... idx> const typename value_type &
find(const typename std::tuple_element<idx..., typename value_type>::type &keys...) {
const std::size_t row_id = getId<idx...>(keys);
return data_.at(row_id);
}
什么根本不起作用。 編譯錯誤C2660-查找:函數沒有3個參數。 有人可以解釋一下,我在這里想念什么? 謝謝。
編輯:
container
類的標題為
template<typename ... Arguments> class container
提到的value_type
是
typedef std::tuple < Arguments... > value_type;
EDIT2:TC的回答確實有用,盡管我仍在使用可變參數模板來爬蟲。 目前:
enum tag {/*...*/}
int main() {
container<tag, std::string, int, int, int> m;
}
template<typename ... Arguments> class container {
public:
typedef std::tuple < Arguments... > value_type;
std::vector<value_type> data_;
template <int id> void narrowRange(
std::set<std::size_t> & range,
const typename std::tuple_element<id, typename value_type>::type &key)
{
// all commented out
}
template <int id, int ... idx>
void narrowRange(
std::set<std::size_t> & range,
const typename std::tuple_element<id, typename value_type>::type & key,
const typename std::tuple_element<idx, typename value_type>::type & ... keys) // <-
{
narrowRange<idx...>(range, keys...);
// rest commented out
}
將在標記的行上調用MSVS2013中的內部錯誤。 任何建議,為什么將不勝感激。
首先, value_type
不需要typename
-我很確定語法實際上禁止它。
其次,您過早擴展idx
,並且錯誤地嘗試擴展聲明中的keys
。 (第二個...
實際上被解析為C風格的varargs。)您也沒有在函數主體中擴展pack keys
。 假設您要find<2, 3, 4>(255, 0, 0)
調用getId<2, 3, 4>(255, 0, 0)
,正確的語法是
template<int ... idx> const value_type &
find(const typename std::tuple_element<idx, value_type>::type &... keys) {
const std::size_t row_id = getId<idx...>(keys...);
return data_.at(row_id);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.