【发布时间】:2018-03-16 10:05:09
【问题描述】:
我正在寻找一个能够通过增加值来转换std::array 的小函数。该函数必须是编译时函数。
我能够编写一个小的 constexpr 函数,它对长度为 3 的数组执行此操作,但我无法将其推广到任意长度的 std::arrays。我也未能将其概括为包含与chars 不同的内容。
有人知道怎么做吗?
#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;
}
【问题讨论】:
-
您是否希望真正混淆数组或让您的程序正常工作?我有一堆用于前者的代码,尽管它通常会杀死大型包的 MSVC 编译器。
-
@Mikhail:我真的很想混淆我的字符串,这样就没有人可以读取编译文件中的字符串。我的琴弦通常很短。我只是好奇如何做到这一点。
-
@Holt:我必须坚持使用 C++11。但是你的解决方案是什么?是编译时表达式吗?
-
目的是什么?混淆不是加密,攻击者要对你的字符串进行混淆并不难,那么为什么还要麻烦呢?
-
我正在为好奇什么可以在编译时完成而烦恼。很明显,只要付出足够的努力就可以破解混淆器。
标签: c++ variadic-templates template-meta-programming constexpr stdarray