ページ 1 / 1
あるクラスを継承しているtemplate
Posted: 2013年11月30日(土) 12:32
by 五穀豊穣
初歩的な質問です。
templateで、それがあるクラスを継承しているようにできるでしょうか。
たとえば、
コード:
class CBase{
public:
void basefunc();
};
class CDerived1 : public CBase{
};
class CDerived2 : public CBase{
};
template<class T>;
class Hoge{
T t;
void func(){t.basefunc();}//TがCBaseを継承していることが決まっていればできる?
};
今入門書が手元になく、またググってもよくわからなかったので質問させていただきました。
そもそもこういう機能はないのでしょうか?
Re: あるクラスを継承しているtemplate
Posted: 2013年11月30日(土) 13:02
by 五穀豊穣
あ、一応追記しておきますが、このコードで動くのか、ということではなく、template宣言とかを変えて、こういうことができるようにできるか、という質問です。
CBaseのポインタをもって、そこにキャストすれば同じようなことができるのはわかりますが、この場合はよくてもvector<T>とかを持たせたいときに面倒なことになると思うのです。
なにか解決方法があればよろしくお願いします。
Re: あるクラスを継承しているtemplate
Posted: 2013年11月30日(土) 13:38
by h2so5
五穀豊穣 さんが書きました:あ、一応追記しておきますが、このコードで動くのか、ということではなく、template宣言とかを変えて、こういうことができるようにできるか、という質問です。
できません。テンプレート型の制約を追加する場合はキャストを使ってください。
vector<T>とかを持たせたいときに面倒になるとは具体的にどのような状況ですか?
Re: あるクラスを継承しているtemplate
Posted: 2013年11月30日(土) 17:13
by tk-xleader
C++11であれば(C++03でもboostやtr1を用いれば)、テンプレートパラメータTに対して、TがCBaseを必ず継承していなければならないという制約を加えること自体は、(それに意味があるかどうかは別として…)type_traitsと部分特殊化を使って次のように書けば出来なくはないです。
コード:
#include <iostream>
#include <type_traits>
using namespace std;
class CBase{
public:
void basefunc(){
cout << "basefunc" << endl;
}
};
template<typename T,bool is_derived_from_base>
class Hoge_impl; // 何も定義しない
// 特殊化
template<typename T>
class Hoge_impl<T,true>{
T t;
public:
void func(){
t.basefunc();
}
};
template<typename T>
class Hoge : private Hoge_impl<T,std::is_base_of<CBase,T>::value>{
public:
using Hoge_impl<T,std::is_base_of<CBase,T>::value>::func;
};
class CDerived1 : public CBase{
};
class CDerived2 : public CBase{
};
class CNotDerived{
};
int main()
{
//これは通る。
Hoge<CDerived1> hoge1;
Hoge<CDerived2> hoge2;
//が、これは通らない。
//Hoge<CNotDerived> hoge3;
// Hoge<int> hoge4;
hoge1.func();
hoge2.func();
// hoge3.func();
// hoge4.func();
return 0;
}
http://ideone.com/CENEJS
Re: あるクラスを継承しているtemplate
Posted: 2013年11月30日(土) 21:42
by 五穀豊穣
返信くださったお二人方ありがとうございます!
ええと、考えていた状況としては、
vector<Enemy>をもつEnemyManagerとvector<Shot>を持つShotManagerを共用できたらいいなと考えていたんですが、(EnemyとShotはObjから継承)
やっぱり個別に作ったほうがいいですかね…?
h2so5 さん、
テンプレート型の制約を追加する場合はキャストを使ってください。
とは、tk-xleader さんのおっしゃていることでしょうか?
tk-xleader さん、
わざわざ書いてくれてありがとうございます。けっこう長くて難しいですね…理解できないところがいくつかあります。
やはり違う方法でやったほうがいいんでしょうか。
Re: あるクラスを継承しているtemplate
Posted: 2013年11月30日(土) 22:12
by 五穀豊穣
私用でしばらく来れないので、解決チェックをつけておきます。
また暇があるときにいただいた回答を参考にして考えさせてもらいますm(_ _)m