Следующий код пытается (без использования С++ 11) создать трейт для определения того, является ли тип итерируемым в стиле STL:
#include <iostream>
#include <vector>
template<typename C>
struct IsIterable
{
typedef char true_type;
typedef long false_type;
template<class T> static true_type is_beg_iterable(
typename T::const_iterator = C().begin());
template<class T> static false_type is_beg_iterable(...);
enum { value = sizeof(is_beg_iterable<C>()) == sizeof(true_type) };
};
int main() {
std::cout << IsIterable<std::vector<int>>::value << std::endl;
}
Есть также метод is_end_iterable, который здесь для краткости опущен
Код не работает с gcc 4.9.2 *(также как в более старых версиях) и clang и преуспевает в VS2012. Я утверждаю, что версия с переменным аргументом всегда будет последней при разрешении перегрузки (поэтому не должно быть двусмысленности), так что кто здесь прав?
Есть ли кроссплатформенный обходной путь/альтернатива?
Теперь я вижу, что более новые версии VS также отклоняют код, поэтому ответ на последний вопрос становится более важным