2012-02-17 21 views
3

C++オブジェクトがtime_tであるかどうかを判断するには、time_tが整数型ではなく?C++オブジェクトがtime_tであるかどうかを判断する方法

私は、特に非特殊関数がときtime_t型が渡されるように定義された一体型呼び出されること

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

は、このような、機能を特化テンプレートたいです。

私のSTL実装では、time_tlongと定義されているため、myFunction(42L)はtime_tの特殊化を呼び出します。どうすればこれを防ぐことができますか?

longを特化してみましたが、コンパイルエラーが発生しました(本体が既に定義されています)。私もrttiを試しました、typeid(time_t).name()"long"を返します。

time_tとそれが定義されている整数型を区別することができますか?テンプレートは、その整数型が特殊化に渡されないようにtime_tを特化していますか?

テンプレートを使用する方法が望ましいでしょうが、解決方法、実行時またはコンパイル時は受け入れます。

+2

あなたは[ドブス博士が提供する強力なtypedefの実装](http://drdobbs.com/184401633) –

+0

ベン、私はそれが答えだったらいいと思う.. – sarnold

答えて

6

これを防ぐ方法はありません。

C++では、typedefすべてのの目的の基本型に相当します。コンパイル時には同等です。実行時には同等です。

time_tの定義を完全に削除し、それを別の種類として再定義できますが、それは適切なtime_tを必要とする関数を呼び出すユーザーコードの機能を壊すことになります。

3

あなたは基本的にあなたが望むものを手に入れることはできません。 time_tは、(少なくともC標準で)typedef(ヒントは名前の一部である "_t"です)として定義されていますが、これは新しいタイプを導入しません。誰かが名前を呼ぶのか別の名前を呼ぶのかを区別したいが、CとC++はそれを許さない。