template <typename T1, typename T2>
T1* find ( T1* begin, T1* end, T2 const& val) {
	while ( begin != end) {
		if ( *begin == val) break;
		++begin;
	}
	return begin;
}

int main() {
    //all combinations of const-nonconst work
    //mixed types also work
	const char a1[] = {1,2,3,4,5};
	const int v1 = 3;
	find ( a1, a1+5, v);

	char a2[] = {1,2,3,4,5};
	const int v2 = 3;
	find ( a2, a2+5, v);

	const char a3[] = {1,2,3,4,5};
	int v3 = 3;
	find ( a3, a3+5, v);

	char a3[] = {1,2,3,4,5};
	int v3 = 3;
	find ( a3, a3+5, v);
}