テンプレートが複雑すぎる?
以下のような文字列比較関数を作ろうと思っています。
○配列変数であるときは配列版を、そうでないときはポインタ版を呼び出す
配列のサイズがわかるときは、仮に\0で終端していなくてもそれ以上検索しない
○charかwchar_tかを意識せずに使える
○charとwchar_tという記述ではなく、templateでできるだけジェネリック?的に記述したい
//charを入れるとwchar_t、wchar_tを入れるとcharを返すメタ関数
template<typename T> struct invert{};
template<> struct invert<char>{ typedef wchar_t t; };
template<> struct invert<wchar_t>{ typedef char t; };
//同じ型同士の比較は省略
//A: 両方ポインタ
template<typename T>
bool compare(const T *const &v1, const typename invert<T>::t *const &v2);
//B1: 左がポインタ、右が配列
template<typename T, size_t L>
bool compare(const T *const &v1, const typename invert<T>::t (&v2)[L]);
//B2: Tとtypename invert<T>::tを逆に
template<typename T, size_t L>
bool compare(const typename invert<T>::t *const &v1, const T (&v2)[L]);
//C: 左が配列、右がポインタ
//省略
//D: 両方配列
template<typename T, size_t L1, size_t L2>
bool compare(const T (&v1)[L1], const typename invert<T>::t (&v2)[L2]);
char aa[] = "abc";
char *pa = aa;
wchar_t aw[] = L"abc";
wchar_t *pw = aw;
bool c1 = compare(pa, pw); //A
bool c2 = compare(pa, aw); //B1はC2784, B2なら可
bool c3 = compare(aa, pw); //C
bool c4 = compare(aa, aw); //DはC2784
invert<T>::t (&v2)[L]という記述が複雑?なのかB1は呼べず、B2と記述すると通りました。
しかしDはどちらも配列であるため、B2のように回避できません。
オーバーロードを全て記述せずに、できるだけ簡単にすます方法はありませんか?
環境はVC++2010です。
お礼
ご返答ありがとうございます。 ゲノムをテンプレートにして読めるものなんですね。 ゲノムが読まれていないバクテリアの特定の遺伝子を他の種で保存性が高い領域から混合primerを作成し、PCRで増幅してシークエンスを決めようと思っているのですが、開始と終止の部分をどうやって決めようか検討をしているところでした。 inverse PCRをしようかと考えていたところに、BigDyeのプロトコールが目にとまり、簡単にできるならと思って書き込みをしました。 教えていただいたHPをもう少し精読して、検討させていただきます。 本当にありがとうございました。