#include <type_traits>
template<typename ...Args>
struct count_void;
template<>
struct count_void<>{
static const int value = 0;
};
template<typename T, typename ...Args>
struct count_void<T, Args...>{
static const int value = std::is_same<void, T>::value + count_void<Args...>::value;
};
template<
template<class...> class cont,
template<class...> class f,
class... lst
>
struct mapCont{
static const int value = cont<typename f<lst>::type...>::value;
};
template<typename T>
struct int_to_void{
typedef T type;
};
template<>
struct int_to_void<int>{
typedef void type;
};
int
main(){
static_assert(count_void<int, void, float>::value == 1, "");
static_assert(mapCont<count_void, int_to_void, int, void, float>::value == 2, "");
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4Kc3RydWN0IGNvdW50X3ZvaWQ7Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBjb3VudF92b2lkPD57CglzdGF0aWMgY29uc3QgaW50IHZhbHVlID0gMDsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CnN0cnVjdCBjb3VudF92b2lkPFQsIEFyZ3MuLi4+ewoJc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9IHN0ZDo6aXNfc2FtZTx2b2lkLCBUPjo6dmFsdWUgKyBjb3VudF92b2lkPEFyZ3MuLi4+Ojp2YWx1ZTsKfTsKCgp0ZW1wbGF0ZTwKCXRlbXBsYXRlPGNsYXNzLi4uPiBjbGFzcyBjb250LAoJdGVtcGxhdGU8Y2xhc3MuLi4+IGNsYXNzIGYsCgljbGFzcy4uLiBsc3QKPgpzdHJ1Y3QgbWFwQ29udHsKCXN0YXRpYyBjb25zdCBpbnQgdmFsdWUgPSBjb250PHR5cGVuYW1lIGY8bHN0Pjo6dHlwZS4uLj46OnZhbHVlOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IGludF90b192b2lkewoJdHlwZWRlZiBUIHR5cGU7Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBpbnRfdG9fdm9pZDxpbnQ+ewoJdHlwZWRlZiB2b2lkIHR5cGU7Cn07CgppbnQKbWFpbigpewoJc3RhdGljX2Fzc2VydChjb3VudF92b2lkPGludCwgdm9pZCwgZmxvYXQ+Ojp2YWx1ZSA9PSAxLCAiIik7CglzdGF0aWNfYXNzZXJ0KG1hcENvbnQ8Y291bnRfdm9pZCwgaW50X3RvX3ZvaWQsIGludCwgdm9pZCwgZmxvYXQ+Ojp2YWx1ZSA9PSAyLCAiIik7CglyZXR1cm4gMDsKfQo=