テンプレート関数とtypeid

[戻る]
ニラ 2013/04/21(日) 17:38:28
お世話になります。

テンプレート関数に二つの型を与え、その二つが同じ型ならばtrue,違うならfalseを
返す仕組みで

template<class X,class Y>bool XandY(X *x,Y *y)
{
    return typeid(y)==typeid(x);

}
というのを書いたのですが、return typeid(y)==typeid(x);において

error C2676:二項演算子'=='const type_infoは、この演算子または定義済みの演算子に
適切な型への変換の定義を行いません。

と言うエラーが出ました。

冒頭で述べた関数を作るには、どういった設計が正しいのでしょうか。

tetrapod 2013/04/21(日) 21:01:27
提示コードは期待通りに動くと思うのだが・・・コンパイラは何?

typeid は「実行時」の動的評価を行うためのものである、のに対して
template は「コンパイル時」の静的評価を行うものなのである。
(提示コードは typeid の実行時型評価を使っていないわけで)
提示コードを書いたプログラマの意図がコンパイル時静的評価なのであれば、
牛刀割鶏、大げさすぎだと思われる・・・
こういうときは template の多重定義で十分だろう。
// 多重定義で同じ型を指定したときのみ呼ばれる
template<typename T> bool issame(T*, T*) { return true; }
// 上にヒットしない、すなわち T と U が異なるときに呼ばれる
template<typename T, typename U> bool issame(T*, U*) { return false; }

実行時評価が必要ならまた話は別だ。
その場合は提示コードに一工夫加える必要がある。

あと const/volatile をどう扱いたいのかでも話は違う。

仲澤@失業者 2013/04/22(月) 10:08:17
MSさんのVisual Studioシリーズだと、

#include <typeinfo.h>

が必要になりますけと、そのあたりは大丈夫ですか。
class type_infoがないと、比較演算子が未定義になります。

あとは、コンパイルオプションで、「ランタイム型情報を有効にする」が、
「はい」になっている必要もあります( /GR)。

YuO [E-Mail] 2013/04/22(月) 14:07:47
> #include <typeinfo.h>
流石に現在は<typeinfo>ですね。
また,<typeinfo>のインクルードする前にtypeid使うこと自体がill-formedなので,
# ISO/IEC 14882:1998/2003/2011 5.2.8 Type identification ¶6
<typeinfo>のインクルードが必要なのはVC++に限った話ではないです。

仲澤@失業者 2013/04/22(月) 15:49:40
orz. そうでね。
Bad_cast とかつうわけね〜し(vv;)。

仲澤@失業者 2013/04/22(月) 15:50:29
orz. そうですね。(恥の上塗り)

ニラ 2013/04/22(月) 16:43:33
[[解決]]
たくさんのご返答、ありがとうございます。
開発環境にはVisualStudioExpress2012を使用しております。
仲澤@失業者さんのご指摘通り、

#include <typeinfo.h>

を冒頭においたら、無事ビルドが通りました。

簡単なことでお騒がせしてしまい、申し訳ございませんでした。

tetrapod 2013/04/22(月) 19:12:25
いやだから <typeinfo> だって。

提示コードは template の良さも typeinfo の良さも、両方台無しにしているので
俺の提示コードを再考してほしい。

古いスレッドには追加発言できません。