template特殊化

[戻る]
tenteku 2010/04/15(木) 18:35:36
お世話になっております。

boost::array<T, size_t>
のような形で
Tを特殊化する場合どのように書けば良いのでしょうか?
array.hppやネットを覗いてみたんですがわかりませんでした・・。

環境はVS2008WinXPです。よろしくお願いします。

tetrapod 2010/04/16(金) 08:39:16
答えを書いちゃうのは簡単だけど・・・

boost::array の特殊化ということなら、以下の3点を知っておけばできるかな。
・名前空間内 template の特殊化は、当該名前空間内で行う必要がある
・特殊化では template<> という書き方をする
・1つの template-parameter に対して特殊化したら parameter-list が1つ減る

ということで自分で試した結果を見せてみてほしい。

tenteku 2010/04/16(金) 10:42:03
arrayの特殊化とは違いますが、それはnamespaceつっこむだけっぽいので。。

template<class T>
class XX<T, 0>;

あるいは
template<>
class XX<A, 0>;

のような形は書けますが、Tだけを特殊化しようとするとテンプレート引数が足りません、
Tは宣言と互換性がありませんと怒られます。。ギブです。

tetrapod 2010/04/16(金) 10:49:55
> ・1つの template-parameter に対して特殊化したら parameter-list が1つ減る
つまり「まだ template 記述が必要」なわけだ。

サンプルなど
#include <iostream>
#include <cstdlib>

template<typename T, std::size_t N> struct hoge {
    hoge() { std::cout << "basic template hoge N=" << N << std::endl; }
};

template<> template<std::size_t N> struct hoge<int, N> {
    hoge() { std::cout << "specialized hoge<int> N=" << N << std::endl; }
};

int main() {
    hoge<long, 4> a;
    hoge<int, 8> b;
}

tetrapod 2010/04/16(金) 10:53:23
ということで 上記 hoge を N に対して特殊化してみてくれ。

tenteku 2010/04/16(金) 11:59:36
出来ました!ありがとうございます。ところでNに対してって定数化ってことですかね。
template<typename T>
struct hoge<T, 0>
{
    hoge() { std::cout << "basic template hoge zero" << std::endl; }
};

template<>
struct hoge<int, 0>
{
    hoge() { std::cout << "specialized hoge<int> zero" << std::endl; }
};

int _tmain(int argc, _TCHAR* argv[]){
    hoge<long, 4> a;
    hoge<int, 8> b;
    hoge<long, 0> c;
    hoge<int, 0> d;}

こうですかわかりません orz
自分の意図した通りには動いたつもりですが

weezer 2010/04/21(水) 20:59:26
テンプレート関係は以下の本が勉強になると思います。
どちらも在庫僅かなのでご注意を。

C++ テンプレート完全ガイド
http://www.amazon.co.jp/exec/obidos/ASIN/4798119229/mla-22/ref=nosim/

C++テンプレートテクニック
http://www.amazon.co.jp/exec/obidos/ASIN/4797354534/mla-22/ref=nosim/

tenteku 2010/04/27(火) 11:54:08
[[解決]]
Nに対して特殊化の方はちょっと不明として
自分のやりたかったことは出来たので閉じます。
回答してくださった方々ありがとうございました。

古いスレッドには追加発言できません。