#include <iostream>
#include <type_traits>
#include <tuple>
namespace std {
template<typename T>
struct remove_cvref {
using type = std::remove_cv_t<std::remove_reference_t<T>>;
};
template<typename T>
using remove_cvref_t = typename remove_cvref<T>::type;
}
template<typename T, template<typename...> typename U>
struct is_derived_from_template {
template<typename... Ts>
static constexpr std::true_type f(U<Ts...>);
static constexpr std::false_type f(...);
static constexpr bool value{
decltype(f(std::declval<std::remove_cvref_t<T>>()))::value};
};
template<typename... Ts>
struct S : std::tuple<Ts...> {
S() = default;
};
int main() {
S<> s0;
S<int, double> s1;
S<std::tuple<>> s2;
std::cout << is_derived_from_template<decltype(s0), std::tuple>::value << "\n";
std::cout << is_derived_from_template<decltype(s1), std::tuple>::value << "\n";
std::cout << is_derived_from_template<decltype(s2), std::tuple>::value << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx0dXBsZT4KCm5hbWVzcGFjZSBzdGQgewoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IHJlbW92ZV9jdnJlZiB7CiAgdXNpbmcgdHlwZSA9IHN0ZDo6cmVtb3ZlX2N2X3Q8c3RkOjpyZW1vdmVfcmVmZXJlbmNlX3Q8VD4+Owp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KdXNpbmcgcmVtb3ZlX2N2cmVmX3QgPSB0eXBlbmFtZSByZW1vdmVfY3ZyZWY8VD46OnR5cGU7Cgp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0ZW1wbGF0ZTx0eXBlbmFtZS4uLj4gdHlwZW5hbWUgVT4Kc3RydWN0IGlzX2Rlcml2ZWRfZnJvbV90ZW1wbGF0ZSB7CiAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHM+CiAgc3RhdGljIGNvbnN0ZXhwciBzdGQ6OnRydWVfdHlwZSBmKFU8VHMuLi4+KTsKICBzdGF0aWMgY29uc3RleHByIHN0ZDo6ZmFsc2VfdHlwZSBmKC4uLik7CiAgc3RhdGljIGNvbnN0ZXhwciBib29sIHZhbHVlewogICAgICBkZWNsdHlwZShmKHN0ZDo6ZGVjbHZhbDxzdGQ6OnJlbW92ZV9jdnJlZl90PFQ+PigpKSk6OnZhbHVlfTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgUyA6IHN0ZDo6dHVwbGU8VHMuLi4+IHsKICBTKCkgPSBkZWZhdWx0Owp9OwoKaW50IG1haW4oKSB7CgogIFM8PiBzMDsKICBTPGludCwgZG91YmxlPiBzMTsKICBTPHN0ZDo6dHVwbGU8Pj4gczI7CiAgCgogIHN0ZDo6Y291dCA8PCBpc19kZXJpdmVkX2Zyb21fdGVtcGxhdGU8ZGVjbHR5cGUoczApLCBzdGQ6OnR1cGxlPjo6dmFsdWUgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgaXNfZGVyaXZlZF9mcm9tX3RlbXBsYXRlPGRlY2x0eXBlKHMxKSwgc3RkOjp0dXBsZT46OnZhbHVlIDw8ICJcbiI7CiAgc3RkOjpjb3V0IDw8IGlzX2Rlcml2ZWRfZnJvbV90ZW1wbGF0ZTxkZWNsdHlwZShzMiksIHN0ZDo6dHVwbGU+Ojp2YWx1ZSA8PCAiXG4iOwogIAogIHJldHVybiAwOwp9