#include <iostream>
#include <type_traits>
#include <string>
#include <cstdint>
template <typename... Ts>
struct have_common_type
{
using yes = char[1];
using no = char[2];
template <typename... Us>
static yes& test(typename std::common_type_t<Us...>*);
template <typename...>
static no& test(...);
static constexpr bool value = sizeof(test<Ts...>(nullptr)) == sizeof(yes);
};
int main()
{
std::cout << have_common_type<int, std::uint32_t, char>::value << std::endl; // 1
std::cout << have_common_type<int, bool, std::string>::value << std::endl; // 0
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxjc3RkaW50PgoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgaGF2ZV9jb21tb25fdHlwZSAKewoJdXNpbmcgeWVzID0gY2hhclsxXTsKCXVzaW5nIG5vID0gY2hhclsyXTsKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVXM+CglzdGF0aWMgeWVzJiB0ZXN0KHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGVfdDxVcy4uLj4qKTsKCQoJdGVtcGxhdGUgPHR5cGVuYW1lLi4uPgoJc3RhdGljIG5vJiB0ZXN0KC4uLik7CgkKCXN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IHNpemVvZih0ZXN0PFRzLi4uPihudWxscHRyKSkgPT0gc2l6ZW9mKHllcyk7Cn07CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dCA8PCBoYXZlX2NvbW1vbl90eXBlPGludCwgc3RkOjp1aW50MzJfdCwgY2hhcj46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsgLy8gMQoJc3RkOjpjb3V0IDw8IGhhdmVfY29tbW9uX3R5cGU8aW50LCBib29sLCBzdGQ6OnN0cmluZz46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsgICAvLyAwCglyZXR1cm4gMDsKfQ==