#include <algorithm>
struct foo { using type = int; };
struct bar { using type = char; };
template<typename... Types> struct TypeList {};
//This and getScript are simplified, in reality the involve messier templates...
template<typename ReturnType>
struct ReqBuilder
{
using proxy = ReturnType(*)(void*, bool);
// ...
};
template<typename scriptType>
struct getScript_impl
{
using type = ReqBuilder<typename scriptType::type>;
};
template<typename scriptType>
using getScript = typename getScript_impl<scriptType>::type;
/* REPLACING THIS WITH CODE ABOVE
template<typename scriptType>
using getScript = ReqBuilder<typename scriptType::type>;
*/
template<typename List, template<typename> typename Wrap> struct WrapTypeList_impl {};
template<typename...Ts, template<typename> typename Wrap> struct WrapTypeList_impl<TypeList<Ts...>, Wrap>
{
using type = TypeList<Wrap<Ts>...>;
};
template<typename List, template<typename> typename Wrap>
using WrapTypeList = typename WrapTypeList_impl<List, Wrap>::type;
using list1 = TypeList<getScript<foo>, getScript<bar>>;
using list2 = TypeList<ReqBuilder<typename foo::type>, ReqBuilder<typename bar::type>>;
using list3 = WrapTypeList<TypeList<foo, bar>, getScript>;
int main()
{
constexpr bool A = std::is_same<list1, list2>::value;
constexpr bool B = std::is_same<list1, list3>::value;
constexpr bool C = std::is_same<list2, list3>::value;
static_assert(A, "list1 != list2");
static_assert(B, "list1 != list3");
static_assert(C, "list2 != list3");
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KCnN0cnVjdCBmb28geyB1c2luZyB0eXBlID0gaW50OyB9OwpzdHJ1Y3QgYmFyIHsgdXNpbmcgdHlwZSA9IGNoYXI7IH07Cgp0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUeXBlcz4gc3RydWN0IFR5cGVMaXN0IHt9OwoKCi8vVGhpcyBhbmQgZ2V0U2NyaXB0IGFyZSBzaW1wbGlmaWVkLCBpbiByZWFsaXR5IHRoZSBpbnZvbHZlIG1lc3NpZXIgdGVtcGxhdGVzLi4uCnRlbXBsYXRlPHR5cGVuYW1lIFJldHVyblR5cGU+CnN0cnVjdCBSZXFCdWlsZGVyCnsKCXVzaW5nIHByb3h5ID0gUmV0dXJuVHlwZSgqKSh2b2lkKiwgYm9vbCk7CgkvLyAgLi4uCn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBzY3JpcHRUeXBlPgpzdHJ1Y3QgZ2V0U2NyaXB0X2ltcGwKewoJdXNpbmcgdHlwZSA9IFJlcUJ1aWxkZXI8dHlwZW5hbWUgc2NyaXB0VHlwZTo6dHlwZT47Cn07CnRlbXBsYXRlPHR5cGVuYW1lIHNjcmlwdFR5cGU+CnVzaW5nIGdldFNjcmlwdCA9IHR5cGVuYW1lIGdldFNjcmlwdF9pbXBsPHNjcmlwdFR5cGU+Ojp0eXBlOwoKLyogUkVQTEFDSU5HIFRISVMgV0lUSCBDT0RFIEFCT1ZFCnRlbXBsYXRlPHR5cGVuYW1lIHNjcmlwdFR5cGU+CnVzaW5nIGdldFNjcmlwdCA9IFJlcUJ1aWxkZXI8dHlwZW5hbWUgc2NyaXB0VHlwZTo6dHlwZT47CiovCgp0ZW1wbGF0ZTx0eXBlbmFtZSBMaXN0LCB0ZW1wbGF0ZTx0eXBlbmFtZT4gdHlwZW5hbWUgV3JhcD4gc3RydWN0IFdyYXBUeXBlTGlzdF9pbXBsIHt9Owp0ZW1wbGF0ZTx0eXBlbmFtZS4uLlRzLCB0ZW1wbGF0ZTx0eXBlbmFtZT4gdHlwZW5hbWUgV3JhcD4gc3RydWN0IFdyYXBUeXBlTGlzdF9pbXBsPFR5cGVMaXN0PFRzLi4uPiwgV3JhcD4KewoJdXNpbmcgdHlwZSA9IFR5cGVMaXN0PFdyYXA8VHM+Li4uPjsKfTsKdGVtcGxhdGU8dHlwZW5hbWUgTGlzdCwgdGVtcGxhdGU8dHlwZW5hbWU+IHR5cGVuYW1lIFdyYXA+CnVzaW5nIFdyYXBUeXBlTGlzdCA9IHR5cGVuYW1lIFdyYXBUeXBlTGlzdF9pbXBsPExpc3QsIFdyYXA+Ojp0eXBlOwoKCnVzaW5nIGxpc3QxID0gVHlwZUxpc3Q8Z2V0U2NyaXB0PGZvbz4sIGdldFNjcmlwdDxiYXI+PjsKdXNpbmcgbGlzdDIgPSBUeXBlTGlzdDxSZXFCdWlsZGVyPHR5cGVuYW1lIGZvbzo6dHlwZT4sIFJlcUJ1aWxkZXI8dHlwZW5hbWUgYmFyOjp0eXBlPj47CnVzaW5nIGxpc3QzID0gV3JhcFR5cGVMaXN0PFR5cGVMaXN0PGZvbywgYmFyPiwgZ2V0U2NyaXB0PjsKCmludCBtYWluKCkKewoJY29uc3RleHByIGJvb2wgQSA9IHN0ZDo6aXNfc2FtZTxsaXN0MSwgbGlzdDI+Ojp2YWx1ZTsKCWNvbnN0ZXhwciBib29sIEIgPSBzdGQ6OmlzX3NhbWU8bGlzdDEsIGxpc3QzPjo6dmFsdWU7Cgljb25zdGV4cHIgYm9vbCBDID0gc3RkOjppc19zYW1lPGxpc3QyLCBsaXN0Mz46OnZhbHVlOwoKCXN0YXRpY19hc3NlcnQoQSwgImxpc3QxICE9IGxpc3QyIik7CglzdGF0aWNfYXNzZXJ0KEIsICJsaXN0MSAhPSBsaXN0MyIpOwoJc3RhdGljX2Fzc2VydChDLCAibGlzdDIgIT0gbGlzdDMiKTsKfQ==