Более того, я не думаю, что size_t
гарантированно является синонимом для unsigned
, поэтому даже с суффиксом "u" код может быть не переносимым.аналогичная проблема, которую нужно различать:
string s(10, 97); //size_t, char
string t(s.begin(), s.end()); //iter
Это внутренне перенаправит вызов подходящей вспомогательной функции (где-то требуется проверка во время компиляции, если аргументы целочисленные).Однако в вашем случае типы возвращаемых данных также различаются, поэтому для начала вам придется выбрать правильную перегрузку.
С enable_if
:
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_integral.hpp>
struct FooArray
{
template <typename TIter>
typename boost::disable_if<boost::is_integral<TIter>, int>::type
read( TIter out )
{
*out++ = 123.456; // copy stuff to output iterator
return 99; // error code
}
double read( size_t index )
{
return 1.234; // return value at index
}
};
все будет выглядеть не так плохо