テンプレート関数とtypeid – プログラミング – Home

テンプレート関数とtypeid
 
通知
すべてクリア

[解決済] テンプレート関数とtypeid


ニラ
 ニラ
(@ニラ)
ゲスト
結合: 12年前
投稿: 2
Topic starter  

お世話になります。

テンプレート関数に二つの型を与え、その二つが同じ型ならば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
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

提示コードは期待通りに動くと思うのだが・・・コンパイラは何?

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 をどう扱いたいのかでも話は違う。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

MSさんのVisual Studioシリーズだと、

#include <typeinfo.h>

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

orz. そうでね。
Bad_cast とかつうわけね~し(vv;)。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

orz. そうですね。(恥の上塗り)


返信引用
ニラ
 ニラ
(@ニラ)
ゲスト
結合: 12年前
投稿: 2
Topic starter  

たくさんのご返答、ありがとうございます。
開発環境にはVisualStudioExpress2012を使用しております。
仲澤@失業者さんのご指摘通り、

#include <typeinfo.h>

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

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

いやだから <typeinfo> だって。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました