Можно ли во время компиляции определить, являются ли "аргументы функции" 1 константами времени компиляции?
Например, функция print(int i)
, которая может печатать "constant 5"
, если она называется print(5)
, но "non-constant 5"
, если она называется print(i)
, где i
- некоторая непостоянная переменная. В частности, в ветке "is constant" я должен иметь возможность рассматривать i
как constexpr, включая его использование для аргументов шаблона и т.д.
Макро-трюки, мета-программирование шаблонов и трюки SFINAE все в порядке. В идеале это портативный, но решения, специфичные для компилятора, лучше, чем ничего.
Хорошо, если есть "ложные негативы" - то есть, если постоянные значения иногда обнаруживаются как непостоянные (например, когда определенные оптимизации отключены).
Бонусные точки, если решение может обнаружить, когда постоянные значения косвенно передаются функции (например, когда постоянное значение передается промежуточной функции, которая вызывает print
и которая впоследствии встроена, подвергая константу print
), Это последнее поведение, очевидно, зависит от оптимизации.
Двойные бонусные очки, если он естественно распространяется на несколько аргументов.
Если бы вы могли перегружать версии функций с аргументами constexpr
и без них, это, вероятно, было бы просто, но вы не можете.
1 Я помещаю "аргументы функции" в кавычки здесь, потому что решение строго не требует обнаружения этого состояния внутри функции (или на границе вызывающего/вызываемого со специальными аргументами) - это просто должен появиться вызывающему, как функция, но могут быть использованы макросы или другие трюки, такие как статический объект с operator()
и т.д.