#include <array>
#include <iostream>
#include <vector>
#include <cstdint>
enum class Bar : uint8_t {
ay, bee, see
};
struct S {
static void foo() {}
// std::begin(h) is defined for h of type H
template<typename H, typename... T>
static typename std::enable_if<std::is_pointer<decltype(std::begin(std::declval<H>()))*>::value>::type
foo(const H&, T&&... t)
{ std::cout << "container\n"; foo(std::forward<T>(t)...); }
// H is integral
template<typename H, typename... T>
static typename std::enable_if<std::is_integral<typename std::remove_reference<H>::type>::value>::type
foo(const H&, T&&... t)
{ std::cout << "integer\n"; foo(std::forward<T>(t)...); }
// H is an enum with underlying type = uint8_t
#if 1
template<typename H, typename... T>
//static typename std::enable_if<std::is_same<typename std::underlying_type<H>::type,uint8_t>::value>::type
static typename std::enable_if<std::is_enum<H>::value and (sizeof(H) == sizeof(uint8_t))>::type
foo(const H&, T&&... t)
{ std::cout << "enum\n"; foo(std::forward<T>(t)...); }
#endif
};
int main()
{
S::foo(std::array<int,8>(), 5, 5L, std::vector<int>{}, 5L);
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxjc3RkaW50PgoKZW51bSBjbGFzcyBCYXIgOiB1aW50OF90IHsKICAgIGF5LCBiZWUsIHNlZQp9OwoKc3RydWN0IFMgewoKc3RhdGljIHZvaWQgZm9vKCkge30KCi8vIHN0ZDo6YmVnaW4oaCkgaXMgZGVmaW5lZCBmb3IgaCBvZiB0eXBlIEgKdGVtcGxhdGU8dHlwZW5hbWUgSCwgdHlwZW5hbWUuLi4gVD4Kc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfcG9pbnRlcjxkZWNsdHlwZShzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxIPigpKSkqPjo6dmFsdWU+Ojp0eXBlIApmb28oY29uc3QgSCYsIFQmJi4uLiB0KSAKeyBzdGQ6OmNvdXQgPDwgImNvbnRhaW5lclxuIjsgZm9vKHN0ZDo6Zm9yd2FyZDxUPih0KS4uLik7IH0KCi8vIEggaXMgaW50ZWdyYWwKdGVtcGxhdGU8dHlwZW5hbWUgSCwgdHlwZW5hbWUuLi4gVD4Kc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPEg+Ojp0eXBlPjo6dmFsdWU+Ojp0eXBlIApmb28oY29uc3QgSCYsIFQmJi4uLiB0KSAKeyBzdGQ6OmNvdXQgPDwgImludGVnZXJcbiI7IGZvbyhzdGQ6OmZvcndhcmQ8VD4odCkuLi4pOyB9CgoKLy8gSCBpcyBhbiBlbnVtIHdpdGggdW5kZXJseWluZyB0eXBlID0gdWludDhfdAojaWYgMQp0ZW1wbGF0ZTx0eXBlbmFtZSBILCB0eXBlbmFtZS4uLiBUPgovL3N0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8SD46OnR5cGUsdWludDhfdD46OnZhbHVlPjo6dHlwZSAKc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxIPjo6dmFsdWUgYW5kIChzaXplb2YoSCkgPT0gc2l6ZW9mKHVpbnQ4X3QpKT46OnR5cGUgCiBmb28oY29uc3QgSCYsIFQmJi4uLiB0KQp7IHN0ZDo6Y291dCA8PCAiZW51bVxuIjsgZm9vKHN0ZDo6Zm9yd2FyZDxUPih0KS4uLik7IH0KI2VuZGlmCn07CgoKaW50IG1haW4oKQp7CiAgICBTOjpmb28oc3RkOjphcnJheTxpbnQsOD4oKSwgNSwgNUwsIHN0ZDo6dmVjdG9yPGludD57fSwgNUwpOwp9