首页 > 解决方案 > 使用可变参数模板时,如何获取第 n 个参数类型?

问题描述

我想要一个拥有n值的类,就像std::tuple. 不过,我不能完全使用元组,因为获取值有额外的逻辑——它们是按需的。

请以我写的这个类为例:

// somewhere else
template<typename TVal>
TVal valueGetter() { ... };

template<typename ...TColValue>
class ResultRow
{
public:
  template<unsigned int TIndex>
  get_nth_from_variadric<TIndex, TColValue> GetValue() const
  {
    return valueGetter<get_nth_from_variadric<TIndex, TColValue> >();
  }
  

};

我希望它的工作方式是用户只需调用int myVal = GetValue<1>,给定类模板参数ResultRow<bool, int>。为此,我需要能够将模板参数的索引转换为类型。

我怎样才能做到这一点?

标签: c++templatesc++17variadic-templates

解决方案


一种方法是将可变参数转发到一个元组中,然后使用std::get,例如:

#include <iostream>
#include <tuple>

template<size_t N, typename... Args>
auto f(Args&&... args)
{
  return std::get<N>(std::tuple{std::forward<Args>(args)...});
}

int main(void)
{
  std::cout << f<0>("Hello", "world") << ' ' << f<1>("Hello", "world") << f<0>('!') << '\n';
}

推荐阅读