タイプがある場合T
、コンパイル時にそれを検査して、そのSTLスタイルのコンテナー(任意の値タイプの場合)かどうかを確認するための便利な方法は何ですか?
(仮定:ポインター、参照などはすでに削除されています)
開始コード:
template<class T> // (1)
void f(T&) {}
template<class T> // (2)
void f(std::vector<T>&) {}
void test()
{
int a;
std::vector<int> b;
f(a);
f(b);
}
これで問題なく動作しますが、コンテナを一般化したい場合(つまり、(3)、(4)、...を明示的に定義しない場合)はどうなりますか?
SFINAEとタイプリストを利用すると、コードがいくらか削減されますが、より良い方法はありますか?
それとも、概念に基づいて専門化するためのイディオムはありますか?
または、どういうわけかSFINAEを利用して、目的の専門分野のみを選択的に有効にすることはできますか?
補足として、私はイテレータを使用できません-T
パラメータとしてsを受け取る関数に基づいて専門化しようとしています。
MSaltersの答えによると:
template<class T>
void f(T&, ...) {
std::cout << "flat" << std::endl;
}
template<class Cont>
void f(Cont& c, typename Cont::iterator begin = Cont().begin(),
typename Cont::iterator end = Cont().end()) {
std::cout << "container" << std::endl;
}
(可変引数リストは、f
あいまいさのエラーを解決するための最初の最も好ましくないバージョンを作成するために必要です)