Я ищу небольшую функцию, которая может преобразовывать std::array
, добавляя возрастающие значения. Функция должна быть функцией времени компиляции.
Мне удалось написать небольшую функцию constexpr, которая делает это для массива длины 3, но мне не удалось обобщить ее на std::array
s произвольной длины. Мне также не удалось обобщить его, чтобы он содержал что-то отличное от char
s.
Кто-нибудь знает, как это сделать?
#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;
}