あるクラスを継承しているtemplate

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
五穀豊穣
記事: 10
登録日時: 6年前

あるクラスを継承しているtemplate

#1

投稿記事 by 五穀豊穣 » 6年前

初歩的な質問です。
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を継承していることが決まっていればできる?
};

今入門書が手元になく、またググってもよくわからなかったので質問させていただきました。
そもそもこういう機能はないのでしょうか?

五穀豊穣
記事: 10
登録日時: 6年前

Re: あるクラスを継承しているtemplate

#2

投稿記事 by 五穀豊穣 » 6年前

あ、一応追記しておきますが、このコードで動くのか、ということではなく、template宣言とかを変えて、こういうことができるようにできるか、という質問です。
CBaseのポインタをもって、そこにキャストすれば同じようなことができるのはわかりますが、この場合はよくてもvector<T>とかを持たせたいときに面倒なことになると思うのです。
なにか解決方法があればよろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: あるクラスを継承しているtemplate

#3

投稿記事 by h2so5 » 6年前

五穀豊穣 さんが書きました:あ、一応追記しておきますが、このコードで動くのか、ということではなく、template宣言とかを変えて、こういうことができるようにできるか、という質問です。
できません。テンプレート型の制約を追加する場合はキャストを使ってください。

vector<T>とかを持たせたいときに面倒になるとは具体的にどのような状況ですか?

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

Re: あるクラスを継承しているtemplate

#4

投稿記事 by tk-xleader » 6年前

 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

五穀豊穣
記事: 10
登録日時: 6年前

Re: あるクラスを継承しているtemplate

#5

投稿記事 by 五穀豊穣 » 6年前

返信くださったお二人方ありがとうございます!

ええと、考えていた状況としては、
vector<Enemy>をもつEnemyManagerとvector<Shot>を持つShotManagerを共用できたらいいなと考えていたんですが、(EnemyとShotはObjから継承)
やっぱり個別に作ったほうがいいですかね…?

h2so5 さん、
テンプレート型の制約を追加する場合はキャストを使ってください。
とは、tk-xleader さんのおっしゃていることでしょうか?

tk-xleader さん、
わざわざ書いてくれてありがとうございます。けっこう長くて難しいですね…理解できないところがいくつかあります。
やはり違う方法でやったほうがいいんでしょうか。

五穀豊穣
記事: 10
登録日時: 6年前

Re: あるクラスを継承しているtemplate

#6

投稿記事 by 五穀豊穣 » 6年前

私用でしばらく来れないので、解決チェックをつけておきます。
また暇があるときにいただいた回答を参考にして考えさせてもらいますm(_ _)m

閉鎖

“C言語何でも質問掲示板” へ戻る