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

C++11 在编译时扩展整数序列模板参数,c++11,c++14,variadic-templates,C++11,C++14,Variadic Templates,我有点不确定如何在编译时实现变量扩展。 考虑下面的用例,我想找出序列中最大元素的索引: template<A> struct doSomething { static constexpr int getIndexOfMaxValue() { // recursive variadic expansion } static constexpr int value = getIndexOfMaxValue(); } int main() { std::cou

我有点不确定如何在编译时实现变量扩展。 考虑下面的用例,我想找出序列中最大元素的索引:

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;
}
模板
结构剂量测量{
静态constexpr int getIndexOfMaxValue(){
//递归变量展开
}
静态constexpr int value=getIndexOfMaxValue();
}
int main(){

std::cout大概是这样的:

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;
}
模板
constexpr int getIndexOfMaxValueHelper(
std::整数_序列,
std::索引(U序列){
constexpr T max_val=std::max({Vals…});
constexpr size\u t N=sizeof…(Is);
返回std::min({(Vals==max_val?Is:N)…});
}
模板
结构剂量测量{
静态constexpr int getIndexOfMaxValue(){

return getIndexOfMaxValueHelper(A{},std::make_index_sequence

谢谢,这看起来很好。Noob问题:我想确保
::value
在编译时可用。我用什么正确的方法来判断这种情况?看看
int arr[doSomething::value]
还是
模板结构{};S
编译。这非常有帮助。我仍然无法理解
min((Vals==max_val?Is:N)…)是如何编译的
变量展开发生了。你介意详细说明一下吗?有两个序列是并行运行的-
Vals…
和原始值,
是…
,它们是简单的
0,1,2,
,由
制造索引序列
。所以
(Vals==max\u val?Is:N)…如果
Val
i
位置等于
max\u Val
,则生成一个序列,该序列在
i
位置具有
i
,否则它可能是
N,1,N,N,4,N
。然后该序列上的
min
只选择第一个(最左侧)位置,其中
Val==max\u Val