お世話になっております。
boost::array<T, size_t>
のような形で
Tを特殊化する場合どのように書けば良いのでしょうか?
array.hppやネットを覗いてみたんですがわかりませんでした・・。
環境はVS2008WinXPです。よろしくお願いします。
答えを書いちゃうのは簡単だけど・・・
boost::array の特殊化ということなら、以下の3点を知っておけばできるかな。
・名前空間内 template の特殊化は、当該名前空間内で行う必要がある
・特殊化では template<> という書き方をする
・1つの template-parameter に対して特殊化したら parameter-list が1つ減る
ということで自分で試した結果を見せてみてほしい。
arrayの特殊化とは違いますが、それはnamespaceつっこむだけっぽいので。。
template<class T>
class XX<T, 0>;
あるいは
template<>
class XX<A, 0>;
のような形は書けますが、Tだけを特殊化しようとするとテンプレート引数が足りません、
Tは宣言と互換性がありませんと怒られます。。ギブです。
> ・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;
}
ということで 上記 hoge を N に対して特殊化してみてくれ。
出来ました!ありがとうございます。ところで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
自分の意図した通りには動いたつもりですが
テンプレート関係は以下の本が勉強になると思います。
どちらも在庫僅かなのでご注意を。
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/
Nに対して特殊化の方はちょっと不明として
自分のやりたかったことは出来たので閉じます。
回答してくださった方々ありがとうございました。