Лучший способ скрыть расчеты constexpr - PullRequest
1 голос
/ 07 февраля 2020

Я хотел бы создать структуру параметров constexpr. Несколько его членов будут рассчитываться с помощью функций constexpr. Например:

class Params {
public:
    static constexpr size_t featureWinW{ 7 };
    static constexpr size_t featureWinH{ 7 };

private:
    static constexpr size_t getKernelSize()
    {
        //complex calculation
        return 20;
    }

public:
    static constexpr size_t kernelSize{ getKernelSize() };
}

Я знаю, что getKernelSize похож на тот, который был определен вне класса, поэтому код неверен:

error: ‘static constexpr size_t Params::getKernelSize()’ called in a constant expression before its definition is complete

Как мне переформатировать код, чтобы он был действительным без спама даже выделенное пространство имен с приватными функциями cal c?

Ответы [ 3 ]

6 голосов
/ 07 февраля 2020

Использование лямбды может быть рассмотрено:

class Params {
public:
    static constexpr std::size_t featureWinW{ 7 };
    static constexpr std::size_t featureWinH{ 7 };
    static constexpr std::size_t kernelSize{
        [](){
            //complex calculation
            return 20;
        }(); //  immediately called.
     };
};

Демо

2 голосов
/ 07 февраля 2020

Вы можете рассмотреть класс помощника друга:

class ParamsHelper {
    friend class Params; // friend declaration + forward class declaration
    static constexpr int getKernelSize()
    {
        //complex calculation
        return 20;
    }
};

class Params {
public:
    static constexpr int featureWinW{ 7 };
    static constexpr int featureWinH{ 7 };

    static constexpr int kernelSize{ ParamsHelper::getKernelSize() };
};
1 голос
/ 07 февраля 2020

В C ++ есть ряд вещей, которые вы хотите оставить «скрытыми» для внутреннего использования, но вы не можете разумно использовать static членов класса. Стандартная идиома для обработки этих вещей состоит в том, чтобы создать пространство имен с именем detail или нечто подобное, чтобы вставить их. Вы должны использовать эту идиому здесь.

C ++ 20 модулей могут дать нам более эффективные средства для маркировка данных для внутреннего использования, но до тех пор детальное пространство имен - лучшее, что можно сделать.

...