#include <iostream>
#include <vector>
using namespace std;

struct Foo {
	size_t length() { return 1; }
};

struct Bar {
	void length();
};

template <typename R, bool result = std::is_same<decltype(((R*)nullptr)->length()), size_t>::value>
constexpr bool hasLengthHelper(int) { 
	return result;
}
 
template <typename R>
constexpr bool hasLengthHelper(...) { return false; }

template <typename R>
constexpr bool hasLength() {
	return hasLengthHelper<R>(0);
}

template <typename R>
typename std::enable_if<hasLength<R>(), size_t>::type lengthOf (R r) {
  return r.length();
}

int main() {
	std::cout << hasLength<Foo>() << "; " << hasLength<std::vector<int>>() << "; " << hasLength<Bar>() << "\n";
	std::cout << lengthOf(Foo()) << std::endl;
	return 0;
}