Скрытие переменных constexpr - PullRequest
0 голосов
/ 26 ноября 2018

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

// A.h
constexpr std::array<int,3> a = {1,2,3};

constexpr int Foo() {return a[1]*a[2];}
constexpr int Bar() {return a[3];}

Теперь все это реализовано в заголовочном файле, потому что я хочу, чтобы методы были встроены.Однако я не хочу показывать a кому-либо, включая A.h.Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Если ваша функция не является членом класса, вы можете иметь:

  • public_a.h (видимый пользователям a.cpp)
  • private_a.h (включенa.cpp, расположенный вместе с вашим источником)
  • a.cpp

и поместите функцию в нужное место.Вы просто должны быть уверены, что a.cpp может использоваться кем-тоно это добавляет дополнительную сложность, как фабричный метод.

0 голосов
/ 26 ноября 2018

В мире, предшествующем модулю C ++, ваши возможности ограничены.Распространенной идиомой для того, чтобы выставлять определения вещей, которые вы бы предпочли не видеть пользователям, является создание так называемого «пространства имен».Это пространство имен, обычно называемое detail или что-то в этом роде, которое содержит все элементы, которые не являются частью вашего интерфейса.По соглашению пользователи не должны получать доступ к содержимому в этом пространстве имен.

Вы можете сделать a частным static constexpr членом некоторого класса.Это будет более эффективно предотвращать доступ пользователей к нему.Но у него есть и обратная сторона: вы должны friend использовать каждую функцию, которая его использует.

...