Есть ли способ в C ++ написать функцию, которая может принимать константу времени компиляции в качестве параметра, но даст ошибку компиляции, если вы передадите значение, зависящее от времени выполнения? В частности, у меня есть конструктор, где инициализация с нулевым указателем будет иметь приемлемое поведение, но где инициализация с ненулевым указателем означает, что происходит что-то напуганное.
Подробности, если они имеют значение: класс может быть создан с помощью умного указателя, но не должен быть создан из (не нулевого) необработанного указателя. Для краткости я хотел бы иметь возможность инициализировать непосредственно из литерала нулевого указателя, но умный указатель запрещает неявные преобразования из необработанных указателей. Это означает, что в каждой точке использования требуется дополнительная формулировка, чтобы явно обернуть нулевой указатель в умный указатель. Было бы неплохо дедуплицировать код, переместив перенос в конструктор.
Я знаю, что один из способов сделать это — использовать проверку во время выполнения, если переданный параметр не равен NULL, но я бы предпочел, чтобы преобразование общего необработанного указателя было перехвачено во время компиляции, если это возможно, и позволяло только компиляция, когда необработанный указатель определенно равен нулю.
(Пожалуйста, не забудьте указать, зависит ли ваша техника от функций C ++ 11 или C ++ 14.)
Начиная с C ++ 11, вы можете использовать std::nullptr_t
за то, что вы хотите.