使用宏时,可以在使用-D <name>=<value>
进行编译时定义值。
可以使用constexpr
值进行类似的操作吗?
要激发问题,请考虑以下code,它在编译时生成12x12乘法表并在运行时打印它:
#include <iostream>
#include <algorithm>
#include <ostream>
#include <array>
#include <iomanip>
template <size_t...N>
constexpr auto make_compile_time_sequence(size_t const row, std::index_sequence<N...>) {
return std::array<size_t,sizeof...(N)> {
{
row*(N+1)...
}
};
}
template <size_t...N>
constexpr auto make_compile_time_square(std::index_sequence<N...> ){
return std::array<std::array<size_t, sizeof...(N)>,sizeof...(N)> {
{
make_compile_time_sequence(N+1, std::make_index_sequence<sizeof...(N)>{})...
}
};
}
constexpr std::size_t N = 12;
constexpr auto multab_N = make_compile_time_square(std::make_index_sequence<N>{});
void testCompileTimeArray(std::ostream &out){
std::for_each(std::begin(multab_N), std::end(multab_N),
[&out](auto row) {
out << '\n';
std::for_each(std::begin(row), std::end(row), [&out](auto elt) {
out << std::setw(4) << elt;
});
});
out << '\n';
}
int main() {
testCompileTimeArray(std::cout);
}
目前N
是硬编码的,必须手动更改才能打印MxM乘法表(其中M!= 12)。
是否可以使用-D N=<value>
值constexpr
做类似的事情?