对于 C++03:
#include <iterator>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/utility/enable_if.hpp>
template<typename InputIterator>
typename boost::enable_if<
boost::is_same<
typename boost::remove_cv<
typename std::iterator_traits<InputIterator>::value_type
>::type,
double // expected value_type
>,
double // fooB return type
>::type
fooB(InputIterator first, InputIterator last)
{
return *first;
}
另一个不使用 Boost 的 C++03 解决方案,但在传递无效类型时可能会产生更丑陋的错误:
#include <iterator>
void fooB_helper(double) { }
template<typename T> void fooB_helper(T const&);
template<typename InputIterator>
double fooB(InputIterator first, InputIterator last)
{
fooB_helper(typename std::iterator_traits<InputIterator>::value_type());
return *first;
}
对于 C++11,您可以使用表达式 SFINAE 代替enable_if
,或者您可以static_assert
完全使用 SFINAE 代替。