C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: template引数に不完全な型は指定できるの


(過去ログ 46 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■24571 / inTopicNo.1)  template引数に不完全な型は指定できるのか?
  
□投稿者/ keichan (1回)-(2008/09/04(Thu) 12:00:13)

分類:[C/C++] 

お世話になります。keichanです。
表題の件についてお伺いしたいことがあります。

template class において template 引数に std::map, std::multimap を受け取り
ユーザー側でコンテナを選択させたいのですが、選択時にコンテナの完全型名ではなく
std:map, std::multimap だけを指定できたら見やすくなると思いました。
そこで以下のコードのように試してみたのですが、std::map や std::multimap
だけでは型が決まらないので当然コンパイルエラーに...


環境:VS2008 SP1

template<typename T>
class moge
{
};

template<typename T, typename containerT>
class hoge
{
	containerT<int, moge<T> >	container;
};

int main()
{
	hoge<int, std::map>		map;
	hoge<int, std::multimap>	multimap;
	return 0;
}



解決策として考えられるのは
1. template 引数に完全型名を指定する(hoge<int, std::map<int, moge<int> > >	map;)
2. typedef で hogeクラスまるごと定義しなおす(typedef hoge<int, std::map<int, moge<int> > >	hogehoge;)

くらいしか思いつきません。2. を採用すればいいじゃんっていうのはナシな方向で
スッキリした書き方をご存知な方がいらっしゃれば是非教えてください。

宜しく御願いします。

引用返信 編集キー/
■24575 / inTopicNo.2)  Re[1]: template引数に不完全な型は指定できるのか?
□投稿者/ επιστημη (1309回)-(2008/09/04(Thu) 12:42:19)
επιστημη さんの Web サイト
2008/09/04(Thu) 13:04:37 編集(投稿者)
# えぴちゃんの出番だ♪

> ユーザー側でコンテナを選択させたいのですが、選択時にコンテナの完全型名ではなく
> std:map, std::multimap だけを指定できたら見やすくなると思いました。

テンプレート・テンプレート・パラメータですねー

#include <map>

template<typename T> class moge {};

template<class T, template<class T, class V, class Tr= std::less<T>, class A=std::allocator<T> > class Container>
class hoge {
  Container<int,moge<T> > container;
};

int main()
{
  hoge<int, std::map>      map;
  hoge<int, std::multimap> multimap;
  return 0;
}

引用返信 編集キー/
■24576 / inTopicNo.3)  Re[1]: template引数に不完全な型は指定できるのか?
□投稿者/ アキラ (102回)-(2008/09/04(Thu) 13:03:21)
アキラ さんの Web サイト
参考までに。(なかなか検索に引っかからないので)
http://d.hatena.ne.jp/faith_and_brave/20080207/1202383891
引用返信 編集キー/
■24577 / inTopicNo.4)  Re[2]: template引数に不完全な型は指定できるのか?
□投稿者/ シャノン (599回)-(2008/09/04(Thu) 13:29:31)
No24575 (επιστημη さん) に返信
> template<class T, template<class T, class K, class Tr= std::less<K>, class A=std::allocator<T>>class Container>
> class hoge {
> Container<int,moge<T>>container;
> };

こういう、型引数の集合ってあるじゃないですか。パターンというか。
こういうのも規約化してほしいなぁ、と思った。
型引数に互換性がないと差し替えがきかないので、「ジェネリックなコンテナは(実際には使わなくても)こういう型引数をこういう順番で取るべし」というガイドライン。

コンセプトみたいに、型引数の集合を一つの型にしてしまうようなのはやりすぎだろうなぁ。
引用返信 編集キー/
■24580 / inTopicNo.5)  Re[3]: template引数に不完全な型は指定できるのか?
□投稿者/ アキラ (103回)-(2008/09/04(Thu) 13:37:21)
アキラ さんの Web サイト
2008/09/04(Thu) 13:37:56 編集(投稿者)
No24577 (シャノン さん) に返信
> 型引数に互換性がないと差し替えがきかないので、「ジェネリックなコンテナは(実際には使わなくても)こういう型引数をこういう順番で取るべし」というガイドライン。

規約はどうかわかんないですけど、Variadic Templatesがあればもう少し柔軟にできるんじゃないかと思います。

template <class T, template <class ...Args> class Container>
class Hoge {
    Container<T, Args...> container;
};

※C++0xの話

引用返信 編集キー/
■24584 / inTopicNo.6)  Re[2]: template引数に不完全な型は指定できるのか?
□投稿者/ keichan (3回)-(2008/09/04(Thu) 14:43:18)
επιστημη さん、ありがとうございます。
テンプレート・テンプレート・パラメータですか...初めて見て目から鱗状態です。
一発解決とさせて頂きます。

解決済み
引用返信 編集キー/
■24585 / inTopicNo.7)  Re[2]: template引数に不完全な型は指定できるの
□投稿者/ keichan (4回)-(2008/09/04(Thu) 14:48:19)
2008/09/04(Thu) 14:48:55 編集(投稿者)

#リロードしていなかったので後の返信に気付きませんでした

No24576 (アキラ さん) に返信
> 参考までに。(なかなか検索に引っかからないので)
> http://d.hatena.ne.jp/faith_and_brave/20080207/1202383891
ありがとうございます。アキラさんのサイトで紹介されていたんですね。
template parameters でぐぐったら2番目にヒットしました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -