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

标签 c++ templates variadic-templates c++17 template-meta-programming

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

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++14)委托(delegate)构造函数

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 替代品。

关于c++ - 如何获取参数包中元素的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49058194/

相关文章:

c++ - 嵌套类成员函数不能访问封闭类的函数。为什么?

templates - 在golang模板的循环中访问循环外的值

c++ - 如何检查可变参数模板中的所有类型都可以转换为 size_t?

c++ - 从文字字符串推断类型

c# - 如果 asp.net 页面中的代码 <% ... %> 在 c# 中获取 RepeaterItem

c++ - 模板推演失败

c++ - 收集不同类型的类并在 C++ 中调用它们的方法

c++ - 查找在 3D 网格中具有随机点的立方体的角点

c++ - 在 C++ 中创建和显示十六进制字符串

Django模板名称冲突