如何获取参数包中的元素索引

问题描述 投票:3回答:2

如何获取以下内容以将参数包元素的索引放入元组中?

template< typename... Ts >
class ClassA {
public:
    ClassA( Ts... ts ) : tup( make_tuple( ts, 0 )... ) {}
    // I would like it to expand to this.
    // ClassA( T0 ts0, T1 ts1 ) : tup( make_tuple( ts0, 0 ), make_tuple(ts1, 1) ) {}
    tuple<tuple<Ts, size_t>...> tup;
};

void main() {
    vector<int> a ={ 2, 4, 5 };
    list<double> b ={ 1.1, 2.2, 3.3 };
    ClassA<vector<int>, list<double>, vector<int>, list<double>> mm( a, b, a, b );
}

谢谢。

c++ templates variadic-templates c++17 template-meta-programming
2个回答
5
投票

在我看来(如果你可以使用至少C ++ 14)一个委托构造函数的工作

template <typename ... Ts>
class ClassA
 {
   private:
      template <std::size_t ... Is>
      ClassA (std::index_sequence<Is...> const &, Ts ... ts)
         : tup { std::make_tuple(ts, Is) ... }
       { }

   public:
      ClassA (Ts ... ts)
         : ClassA(std::make_index_sequence<sizeof...(Ts)>{}, ts...)
       { }

      std::tuple<std::tuple<Ts, std::size_t>...> tup;
 };

在C ++ 11中,这不起作用,因为std::index_sequencestd::make_index_sequence只能从C ++ 14开始提供,但是找到(或开发)C ++ 11替代品并不困难。


2
投票

您可以通过简单地将整数作为包扩展的一部分递增来避免使构造函数成为模板和索引序列:

template <typename ... Ts>
class ClassA
 {
   private:
      ClassA (size_t i, Ts ... ts)
         : tup { std::make_tuple(ts, i++) ... }
       { }

   public:
      ClassA (Ts ... ts)
         : ClassA(0, ts...)
       { }

      std::tuple<std::tuple<Ts, size_t>...> tup;
 };

我应该注意到gcc目前正在给我一个关于缺少序列点的警告,但它似乎是一个误报(并且在任何情况下都可以通过编写一个小函数并调用它来轻松修复)。

© www.soinside.com 2019 - 2024. All rights reserved.