2012-02-17 3 views
3

Как определить, является ли объект C++ значением time_t, в отличие от интегрального типа time_t, как?Как определить, является ли объект C++ 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

Возможно, вас заинтересует [реализация сильных typedefs, предоставленных доктором Доббсом] (http://drdobbs.com/184401633) –

+0

Бен, я бы хотел, чтобы это было ответом .. – sarnold

ответ

6

Невозможно предотвратить это.

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

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

3

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

Смежные вопросы