コレクションから標準出力範囲を出力する汎用関数を記述したいとします。それは普遍的になっているので、私は仮定テンプレート引数の型をアサートする方法STLイテレータの型
std::vector<std::string> names = { "John", "Henry", "Mark" };
と同様に...その:
std::vector<int> years = { 100, 200, 400 };
...プリントアウトすることが可能となります。コレクションの種類以来
は異なる場合があり、そして私がテンプレート関数を使用し、基本クラスのイテレータを渡すためにチャンスを与えSTLコレクションの基本クラスが存在しない:すべては今うまく機能
template<typename TIterator>
void PrintRange(TIterator beginIter,TIterator endIter)
{
for(auto it = beginIter; it != endIter; ++it)
{
std::cout << *it << std::endl;
}
}
、今私は書くことができます:
PrintRange(names.begin(), names.end());
と:
PrintRange(years.begin(), years.end());
しかし、今、私は彼にしたいです私の機能のlpクライアントは、なぜ彼がそれを使用するときにエラーがあるかをより速く理解することができます。今、私が呼び出したとき:
main.cpp:23:34: error: invalid type argument of unary ‘*’ (have ‘int’)
私のようなものを印刷したいと思います:
PrintRange(100, 400);
エラーがあり
One of arguments does not correspond to expected argument of type 'iterator'
だから、この問題へのどのようなアプローチが最善です:
気にすることは重要ではありませんエラーメッセージは のように意味がありません。ユーザーはテンプレートクラスコードを に分析して、間違いの理由を確立する必要があります。
static_assertを使用すると、すべての可能性をアサーションすることができますが、基本クラスがないため、関数の引数がANYイテレータであることをどのようにアサートするのですか?
static_assert(std::is_base_of::iterator >::value);
これは文字列のみイテレータのベクトルを主張するだろう...
なぜさまざまなタイプの開始と終了のイテレータですか?それらは同じものでなければなりません – Fureeish
関数に適切な文書を追加すると、ユーザーはテンプレートコードを調べる必要がなく、入力の検証に何も追加作業をする必要はありません。コンパイラの検証をさせてください! –