Может ли пространство имен (быть/удовлетворять) концепции?

Я знаю, что предложение C++ Concepts предназначено, возможно, среди прочего, для наложения ограничений на параметры шаблона (скажем, на «последовательность») в текущей ситуации, в которой все, что удается скомпилировать, достаточно хорошо (и сообщения об ошибках ужасны ).

Но как насчет пространств имен? Я имею в виду, что в настоящее время мы не можем использовать их в качестве параметров шаблона, но можно подумать, что если метод использует только статические методы и члены класса, то пространство имен также должно быть удовлетворительным для передачи ему. Поддерживает ли это текущая версия / текущие реализации предложения по концепциям? Если нет, было ли это рассмотрено и отклонено или просто не рассмотрено?

Связанный вопрос:

Является ли класс только со статическими методами лучше, чем пространство имен только с функциями, не являющимися членами?


person einpoklum    schedule 25.08.2017    source источник
comment
Вы не можете передавать пространства имен.   -  person Yakk - Adam Nevraumont    schedule 25.08.2017
comment
@Yakk: я не хочу их передавать, но, может быть, я смогу использовать их в качестве параметров шаблона.   -  person einpoklum    schedule 25.08.2017
comment
Ты не можешь это делать. Итак, какой у вас вопрос?   -  person Yakk - Adam Nevraumont    schedule 25.08.2017
comment
@Yakk: я не могу сделать это сейчас. Но, может быть, я смогу сделать это с помощью Concepts. Это избавило бы меня от необходимости создавать классы определенных пространств имен. (Хотя, я полагаю, вы могли бы утверждать, что классы без нестатических членов являются допустимыми конструкциями.)   -  person einpoklum    schedule 25.08.2017
comment
Ответ - нет. Ни рабочий проект C++20, ни старая TS Concepts не содержат ничего подобного. Однако вы можете написать предложение для будущей версии языка.   -  person Kerrek SB    schedule 25.08.2017
comment
namespace — это механизм предоставления имен (классов, функций, переменных, перечислений и т. д.) для предотвращения конфликтов. Я сомневаюсь, что абстракция namespace когда-либо трансформируется в точку, где она сможет удовлетворить Concept.   -  person R Sahu    schedule 25.08.2017
comment
@RSahu: И в чем разница между этим и окончательным классом только со статическими членами? Кроме того, пространство имен также используется для группировки кода, когда не требуется создание экземпляров, как в случае с классами.   -  person einpoklum    schedule 25.08.2017
comment
@einpoklum, это вырождается во что-то похожее на пространство имен, не так ли? Тем не менее, я должен задать вопрос. Зачем вам загрязнять абстракцию пространства имен, если класс, вырожденный или нет, может дать вам то, что вам нужно?   -  person R Sahu    schedule 26.08.2017
comment
Re, пространство имен также используется для группировки кода... Как так? Если я объявлю переменные x, y и z внутри namespace foo {...}, эти переменные не будут принадлежать пространству имен. Только их имена принадлежат пространству имен. Пространства имен — это всего лишь уловка, которая избавляет меня от необходимости везде вводить Foo_x, Foo_y и Foo_z.   -  person Solomon Slow    schedule 26.08.2017
comment
@jameslarge: эти переменные не принадлежат пространству имен. Конечно, они делают. Я обращаюсь к ним через пространство имен (я имею в виду синтаксически). Только их имена принадлежат пространству имен — когда я пишу код, я использую их имена. Я мог бы использовать их адреса, но это отдельный вопрос. И - ваше предположение, что пространства имен используются только так, как вы думаете, они должны быть, или для того, что было первоначальной мотивацией для их введения, безосновательно. Просто о том, как развивалась TMP.   -  person einpoklum    schedule 26.08.2017
comment
@RSahu: Зачем вам загрязнять абстракцию пространства имен, если класс ... может дать вам то, что вы хотите? На самом деле все наоборот. Зачем мне загрязнять абстракцию класса чем-то, что не должно (и фактически не может) иметь экземпляры?   -  person einpoklum    schedule 26.08.2017
comment
@einpoklum пространство имен является одноэлементным классом в любом случае.   -  person Massa    schedule 15.11.2017


Ответы (1)


Concepts не добавляет механизма для передачи пространств имен во время компиляции или выполнения. Таким образом, нет никакого способа протестировать пространство имен против концепции или параметризовать код с пространством имен, за исключением макросов.

TS отражения может разрешать отражение над пространствами имен (я не в курсе его текущего состояния), но это ортогонально концепциям. Возможно, можно манипулировать овеществлением и отражением пространств имен, чтобы разрешить проверку понятий пространств имен и каким-то образом передавать их, но если это происходит сегодня, то завтра может не случиться, и наоборот, поскольку оно основано на двух разных пластических функциях, где такой побочный эффект был бы случайным в любой момент. Лучший.

person Yakk - Adam Nevraumont    schedule 25.08.2017
comment
облом. Спасибо. - person einpoklum; 26.08.2017