gpt4 book ai didi

c++ - 使用 constexpr 混淆 std::array

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:00 26 4
gpt4 key购买 nike

我正在寻找一个能够通过增加值来转换 std::array 的小函数。该函数必须是编译时函数。

我能够为长度为 3 的数组编写一个小的 constexpr 函数,但我无法将其概括为任意长度的 std::array。我也未能将其概括为包含不同于 char 的内容。

有人知道怎么做吗?

#include <array>
#include <iostream>
#include <valarray>

constexpr std::array<char,3> obfuscate(const std::array<char,3>& x) {
return std::array<char, 3>{x.at(0)+1, x.at(1) + 2, x.at(2) + 3 };
}

/* Won't compile

template<typename T,typename S, template<typename, typename> L=std::array<T, U>>
constexpr L<T,U> obfuscate(const L<T, U>& x) {
return {x.at(0) + 1, x.at(0) + 2, x.at(0) + 3 };
}
*/

std::ostream& operator<<(std::ostream& str, const std::array<char, 3>& x) {
for (auto i = 0; i < 3; i++) {
str << x.at(i);
}
return str;
}

int main(int argc, char** args) {
std::array<char, 3> x{ 'a','b','c' };
std::cout << x << std::endl;
std::cout << obfuscate(x) << std::endl;
// std::cout << obfuscate<3>(x) << std::endl;
}

最佳答案

你可以使用std::index_sequence:

template<class T, std::size_t N, std::size_t... Is>
constexpr std::array<T, N> helper (const std::array<T, N> &x, std::index_sequence<Is...>) {
return std::array<T, N>{static_cast<T>(x.at(Is)+Is+1)...};
}

template<class T, std::size_t N>
constexpr std::array<T, N> obfuscate(const std::array<T, N> &x) {
return helper(x, std::make_index_sequence<N>{});
}

关于c++ - 使用 constexpr 混淆 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49317953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com