標準ライブラリのセマンティクスを使用します:
- コンテナではなく、イテレータのペアを渡し
foo
ます。これにより、関数がより一般的になります
std::iterator_traits<Iterator>::value_type
値の型を取得するために使用します
static_assert
Iterator の値の型int
(または任意の型)
例 :
#include <list>
#include <vector>
template<typename Iterator>
void foo(Iterator begin, Iterator end)
{
static_assert(std::is_same<int, typename std::iterator_traits<Iterator>::value_type>::value,
"Invalid value type : must be int");
}
int main() {
std::list<int> l1;
std::vector<int> v1;
foo(std::begin(l1), std::end(l1)); // OK
foo(std::begin(v1), std::end(v1)); // OK
std::vector<float> v2;
foo(std::begin(v2), std::end(v2)); // Doesn't compile
}
ライブデモ
ノート:
- コンテナーの特定のメンバー関数にアクセスする必要がある場合
foo
(Deduplicator で指摘されているように、これはパフォーマンス上の理由で発生する可能性があります)、次のContainer
引数に固執する必要がある場合があります。
例:value_type
( MooingDuck が指摘しているように、 に到達するための違いに注意してください。これは、配列で動作させるために必要です):
template <typename Container>
void foo(const Container& c)
{
static_assert(std::is_same<int, std::iterator_type<decltype(std::begin(c))>::value_type>::value, "Invalid value type : must be int");
// Use c member function(s)
}