
I tinkered for a little bit, and couldn't get what I wanted. The problem, from the perspective of general concept checking, is that I want compilation to fail when a substitution failure would happen. For example:
template <typename I, typename T> I find(I first, I last, const T& value) { static_assert (Input_iterator<I>(), ""); while (first != last && *first != value) ++first; } This technique comes closer, but you still get errors messages for a missing copy constructor... I think. template <typename I, typename T> I find_impl(I first, I last, const T& value, true_type) { while (first != last && *first != value) ++first;} template <typename I, typename T> I find_impl(I first, I last, const T& value, false_type) { return first;} template <typename I, typename T> I find(I first, I last, const T& value) { static_assert (Input_iterator<I>(), ""); return find_impl(first, last, value, std::integral_constant<bool, Input_iterator<I>()>()); }