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