需要一个 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>();