staticとtemplate

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

staticとtemplate

投稿記事 by zxc » 11年前

  テンプレートクラスとテンプレート関数をメンバに持つクラスの違い。テンプレートクラスは型ごとにクラス型が作られるけど、テンプレート関数をメンバに持つだけのクラスはインスタンス増えない。何か上手いこと使えないかな・・・シングルトンとか

[codehpp]
//test.hpp
template
class TemplateClass{
private:
static int num;
T t;
public:
TemplateClass(const T& t_value):t(t_value){}
int Num()const{return num;}
const T& T_value()const{return t;}
};

class HavingTemplateFunction{
private:
static int num;
public:
template
const T& T_value(const T& t_value)const{return t_value;}
int Num()const{return num;}
};

int TemplateClass::num = 5;
int TemplateClass::num = 8;
int HavingTemplateFunction::num=2;

[/code]

CODE:

//main.cpp
#include
#include"Hoge.hpp"

template
void launch(const T & t){
	std::cout
void launch(const T & t,const U& u){
	std::cout(u) uns(12);
	TemplateClass dou( 3.141592 );

	HavingTemplateFunction A,B;


	launch(uns);
	launch(dou);
	launch( A,-8 );
	launch( B,-2.718 );

	return 0;
}

CODE:

12,5
3.14159,8
-8,2
-2.718,2
続行するには何かキーを押してください . . .

YuO
記事: 947
登録日時: 14年前

Re: staticとtemplate

投稿記事 by YuO » 11年前

クラスのテンプレートメンバ関数は,使い方が難しいですね。
一番の難点は,テンプレートの型引数によってインスタンスの状態を変更させるのが難しい,ということにつきるかと。

なので,
  • クラステンプレートの変換関数として使う
  • テンプレートの型引数を元に別の型 (クラステンプレートを関数の型引数でインスタンス化した型) を作って,その型の基底クラス (型引数に依存しないクラス) へのポインタ型であるメンバに代入する
など,工夫した使い方が必要になると思います。
オフトピック
インスタンスの状態を変化させず,型引数に依存するメンバ関数を想像するのは意外と難しい……。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: staticとtemplate

投稿記事 by h2so5 » 11年前

JSONパーサーとかで value.get() みたいな使い方はよくありますね。

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: staticとtemplate

投稿記事 by zxc » 11年前

YuO さんが書きました:クラスのテンプレートメンバ関数は,使い方が難しいですね。
一番の難点は,テンプレートの型引数によってインスタンスの状態を変更させるのが難しい,ということにつきるかと。
  h2so5さんも挙げてらっしゃいますが、どっちかというとインスタンスの状態は変更させないで、Get関数なんかで欲しい型を指定するなんてのが思いつく使い方です。結局使い道はあまりなさそうな気がします。