Как определить, является ли объект C ++ time_t - PullRequest
3 голосов
/ 18 февраля 2012

Как я могу определить, является ли объект C ++ time_t, в отличие от целочисленного типа time_t, определенного как?

Я специально хочу, чтобы шаблон специализировал функцию,

template <typename T> void myFunction( T val );
template<>            void myFunction<time_t>( time_t val );

таким образом, что неспециализированная функция вызывается, когда передается целочисленный тип, для которого time_t определен как.

Моя реализация STL определяет time_t как long, поэтому myFunction(42L) вызывает специализацию time_t.Как я могу предотвратить это?

Я пытался специализировать long, что приводит к ошибке компиляции (тело уже определено).Я также попробовал rtti, typeid(time_t).name() возвращает "long".

Как я могу различить time_t и целочисленный тип, для которого он определен, и / или шаблон специализирует time_t так, чтобы его целочисленный тип неполучить специализацию?

Способ сделать это с помощью шаблонов был бы предпочтительнее, но я бы принял любое решение, во время выполнения или во время компиляции.

Ответы [ 2 ]

6 голосов
/ 18 февраля 2012

Нет способа предотвратить это.

В C ++ typedef эквивалентно его базовому типу для всех целей. Во время компиляции они эквивалентны. Во время выполнения они эквивалентны.

Вы можете полностью удалить определение time_t и переопределить его как другой тип, но это нарушит способность пользовательского кода вызывать функцию, ожидающую правильного time_t.

3 голосов
/ 18 февраля 2012

Вы принципиально не можете получить то, что хотите. time_t определяется (по крайней мере, в стандарте C) как typedef (подсказка - это часть имени "_t"), которая не вводит новый тип. Вы хотите провести различие между тем, называет ли кто-то одно или другое имя, но C и C ++ не позволяют этого.

...