微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在编译时扩展整数序列模板参数

如何解决在编译时扩展整数序列模板参数

对于如何在编译时实现可变参数扩展,我有点不确定。 考虑下面的用例,我想找出序列中max-element的索引:

template<A>
struct doSomething {
  static constexpr int getIndexOfMaxValue() {
    // recursive variadic expansion
  }

  static constexpr int value = getIndexOfMaxValue();
}

int main() {
   std::cout << doSomething<std::integer_sequence<int,1,2,3,4,3>::value <<std::endl;
}

有人可以帮我解释一下吗?

解决方法

也许是这样:

template <typename T,T... Vals,size_t... Is>
constexpr int getIndexOfMaxValueHelper(
    std::integer_sequence<T,Vals...>,std::index_sequence<Is...>) {
  constexpr T max_val = std::max({Vals...});
  constexpr size_t N = sizeof...(Is);
  return std::min({(Vals == max_val ? Is : N)...});
}

template <typename A>
struct doSomething {
  static constexpr int getIndexOfMaxValue() {
    return getIndexOfMaxValueHelper(A{},std::make_index_sequence<A::size()>{});
  }

  static constexpr int value = getIndexOfMaxValue();
};

int main() {
   std::cout << doSomething<std::integer_sequence<int,1,2,3,4,3>>::value <<std::endl;
}

Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。