template<typename T> struct S {};
template<typename T> struct R {};
template<
typename T,
typename V>
struct xxx;
template<
template <class> class A,
template <class> class B,
typename X,
typename Y>
struct xxx<A<X>, B<Y>> {
static constexpr const int value = false;
};
template<
template <class> class U,
typename X,
typename Y>
struct xxx<U<X>, U<Y>> {
static constexpr const int value = true;
};
int main() {
typedef S<double> s1;
typedef S<int> s2;
typedef R<int> s3;
static_assert(xxx<s1, s2>::value,
"No, assertion must not be raised");
static_assert(xxx<s2, s3>::value,
"Yes, assertion must be raised");
}
dGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFMge307CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBSIHt9OwoKdGVtcGxhdGU8CiAgdHlwZW5hbWUgVCwKICB0eXBlbmFtZSBWPgpzdHJ1Y3QgeHh4OwoKdGVtcGxhdGU8CiB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEEsCiB0ZW1wbGF0ZSA8Y2xhc3M+IGNsYXNzIEIsCiB0eXBlbmFtZSBYLAogdHlwZW5hbWUgWT4Kc3RydWN0IHh4eDxBPFg+LCBCPFk+PiB7CiAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBpbnQgdmFsdWUgPSBmYWxzZTsKfTsKCgp0ZW1wbGF0ZTwKIHRlbXBsYXRlIDxjbGFzcz4gY2xhc3MgVSwKIHR5cGVuYW1lIFgsCiB0eXBlbmFtZSBZPgpzdHJ1Y3QgeHh4PFU8WD4sIFU8WT4+IHsKICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGludCB2YWx1ZSA9IHRydWU7Cn07CgppbnQgbWFpbigpIHsKICB0eXBlZGVmIFM8ZG91YmxlPiBzMTsKICB0eXBlZGVmIFM8aW50PiBzMjsKICB0eXBlZGVmIFI8aW50PiBzMzsKICBzdGF0aWNfYXNzZXJ0KHh4eDxzMSwgczI+Ojp2YWx1ZSwKICAgICAgICAgICAgICAgICJObywgYXNzZXJ0aW9uIG11c3Qgbm90IGJlIHJhaXNlZCIpOwogIHN0YXRpY19hc3NlcnQoeHh4PHMyLCBzMz46OnZhbHVlLAogICAgICAgICAgICAgICAgIlllcywgYXNzZXJ0aW9uIG11c3QgYmUgcmFpc2VkIik7Cn0=
prog.cpp:33:3: error: static_assert failed "Yes, assertion must be raised"
static_assert(xxx<s2, s3>::value,
^ ~~~~~~~~~~~~~~~~~~
1 error generated.