簡體   English   中英

C ++可變參數模板

[英]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.

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