在编译时扩展整数序列模板参数
Expanding integer-sequence template-param in compile time
我有点不确定如何在编译时实现可变参数扩展。
考虑下面的用例,我想找出序列中最大元素的索引:
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;
}
我有点不确定如何在编译时实现可变参数扩展。 考虑下面的用例,我想找出序列中最大元素的索引:
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;
}