需要一个 constexpr 来使 for 循环中的值加倍
Need a constexpr for doubling value in for loop
我想在每次处理 for 循环时将一个值加倍。到目前为止我有以下代码:
constexpr size_t doubleN(size_t n, size_t iteration)
{
return n * iteration;
};
const array<size_t, 9> iterationArray = { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
for (size_t i = 1; i <= 10; i++)
{
Insertionsort<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, iterationArray[i])> insertionsort;
Util<doubleN(INITIAL_SIZE_N_INSERTIONSORT, iterationArray[i])> util;
array<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, iterationArray[i])> arrayRef;
util.generateRandomDoubleArray(arrayRef);
util.overwriteProcessorCache();
cout << "Measure Insertionsort version 1 with n = " << INITIAL_SIZE_N_INSERTIONSORT << "." << endl;
util.startTimeMeasure();
insertionsort.sortVersion1(arrayRef);
util.stopTimeMeasure();
cout << "Measureing Insertionsort version 1 successful." << endl;
}
我的问题是,我无法将 constexpr
返回的值加倍,因为它始终需要一个常量值作为参数。你知道如何得到一个 constexpr
并且 returns 总是一个基于之前的双倍值的双倍值吗?
首先,将您的运行时i
参数转换为编译时值:
template <std::size_t I>
void foo()
{
Insertionsort<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, I)> insertionsort;
Util<doubleN(INITIAL_SIZE_N_INSERTIONSORT, I)> util;
array<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, I)> arrayRef;
util.generateRandomDoubleArray(arrayRef);
util.overwriteProcessorCache();
cout << "Measure Insertionsort version 1 with n = " << INITIAL_SIZE_N_INSERTIONSORT << "." << endl;
util.startTimeMeasure();
insertionsort.sortVersion1(arrayRef);
util.stopTimeMeasure();
cout << "Measureing Insertionsort version 1 successful." << endl;
}
然后做一个循环:
template <size_t ... Is>
void foos()
{
int dummy[] = {0, (foo<Is>(), 0)...};
(void) dummy; // avoid warning for unused variable
}
或者用 C++17 的折叠表达式:
template <size_t ... Is>
void foos()
{
(foo<Is>(), ...);
}
并称它为:
foos<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>();
我想在每次处理 for 循环时将一个值加倍。到目前为止我有以下代码:
constexpr size_t doubleN(size_t n, size_t iteration)
{
return n * iteration;
};
const array<size_t, 9> iterationArray = { 1, 2, 3, 4, 5, 6, 7, 8, 10 };
for (size_t i = 1; i <= 10; i++)
{
Insertionsort<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, iterationArray[i])> insertionsort;
Util<doubleN(INITIAL_SIZE_N_INSERTIONSORT, iterationArray[i])> util;
array<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, iterationArray[i])> arrayRef;
util.generateRandomDoubleArray(arrayRef);
util.overwriteProcessorCache();
cout << "Measure Insertionsort version 1 with n = " << INITIAL_SIZE_N_INSERTIONSORT << "." << endl;
util.startTimeMeasure();
insertionsort.sortVersion1(arrayRef);
util.stopTimeMeasure();
cout << "Measureing Insertionsort version 1 successful." << endl;
}
我的问题是,我无法将 constexpr
返回的值加倍,因为它始终需要一个常量值作为参数。你知道如何得到一个 constexpr
并且 returns 总是一个基于之前的双倍值的双倍值吗?
首先,将您的运行时i
参数转换为编译时值:
template <std::size_t I>
void foo()
{
Insertionsort<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, I)> insertionsort;
Util<doubleN(INITIAL_SIZE_N_INSERTIONSORT, I)> util;
array<double, doubleN(INITIAL_SIZE_N_INSERTIONSORT, I)> arrayRef;
util.generateRandomDoubleArray(arrayRef);
util.overwriteProcessorCache();
cout << "Measure Insertionsort version 1 with n = " << INITIAL_SIZE_N_INSERTIONSORT << "." << endl;
util.startTimeMeasure();
insertionsort.sortVersion1(arrayRef);
util.stopTimeMeasure();
cout << "Measureing Insertionsort version 1 successful." << endl;
}
然后做一个循环:
template <size_t ... Is>
void foos()
{
int dummy[] = {0, (foo<Is>(), 0)...};
(void) dummy; // avoid warning for unused variable
}
或者用 C++17 的折叠表达式:
template <size_t ... Is>
void foos()
{
(foo<Is>(), ...);
}
并称它为:
foos<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>();