#include <tuple>
#include <iostream>
struct A {
static void tip();
};
struct B {
static void tip();
};
struct Z {
};
// Indicates whether the template parameter contains a static member named tip.
template<class T>
struct has_tip {
template<class U>
struct clean_type {
typedef typename std::remove_const<typename std::remove_reference<U>::type>::type type;
};
template<class U>
static char test(decltype(&U::tip));
template<class U>
static float test(...);
static const bool value = sizeof(test<typename clean_type<T>::type>(0)) == sizeof(char);
};
// Indicates whether the n-th type contains a tip static member
template<size_t n, typename... Ts>
struct nth_type_has_tip {
static const bool value = has_tip<typename std::tuple_element<n, std::tuple<Ts...>>::type>::value;
};
// Generic iteration
template<size_t index, size_t n>
struct TupleIter
{
template< typename... Ts >
typename std::enable_if< nth_type_has_tip<index, Ts...>::value , void >::type
static Iter(const std::tuple<Ts...>& tpl)
{
std::cout << "tip\n";
TupleIter<index + 1, n>::Iter(tpl );
}
template< typename... Ts >
typename std::enable_if< !nth_type_has_tip<index, Ts...>::value , void >::type
static Iter(const std::tuple<Ts...>& tpl) {
std::cout << "no tip\n";
TupleIter<index + 1, n>::Iter(tpl );
}
};
// Base class, we've reached the tuple end
template<size_t n>
struct TupleIter<n, n>
{
template<typename... Ts >
static void Iter( const std::tuple<Ts...>& tpl ) {
std::cout << "end\n";
}
};
// Helper function that forwards the first call to TupleIter<>::Iter
template<typename... Ts>
void iterate(const std::tuple<Ts...> &tup) {
TupleIter<0, sizeof...(Ts)>::Iter(tup);
}
int main() {
A a;
B b;
Z z;
std::tuple<const A&,const B&,const Z&> tup(a,b,z);
iterate(tup);
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpzdHJ1Y3QgQSB7CiAgc3RhdGljIHZvaWQgdGlwKCk7Cn07CgpzdHJ1Y3QgQiB7CiAgc3RhdGljIHZvaWQgdGlwKCk7Cn07CgpzdHJ1Y3QgWiB7Cn07CgovLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGNvbnRhaW5zIGEgc3RhdGljIG1lbWJlciBuYW1lZCB0aXAuCnRlbXBsYXRlPGNsYXNzIFQ+CnN0cnVjdCBoYXNfdGlwIHsKICAgIHRlbXBsYXRlPGNsYXNzIFU+CiAgICBzdHJ1Y3QgY2xlYW5fdHlwZSB7CiAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VT46OnR5cGU+Ojp0eXBlIHR5cGU7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZTxjbGFzcyBVPgogICAgc3RhdGljIGNoYXIgdGVzdChkZWNsdHlwZSgmVTo6dGlwKSk7CiAgICAKICAgIHRlbXBsYXRlPGNsYXNzIFU+CiAgICBzdGF0aWMgZmxvYXQgdGVzdCguLi4pOwogICAgCiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZih0ZXN0PHR5cGVuYW1lIGNsZWFuX3R5cGU8VD46OnR5cGU+KDApKSA9PSBzaXplb2YoY2hhcik7Cn07CgovLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbi10aCB0eXBlIGNvbnRhaW5zIGEgdGlwIHN0YXRpYyBtZW1iZXIKdGVtcGxhdGU8c2l6ZV90IG4sIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgbnRoX3R5cGVfaGFzX3RpcCB7CiAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGhhc190aXA8dHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PG4sIHN0ZDo6dHVwbGU8VHMuLi4+Pjo6dHlwZT46OnZhbHVlOwp9OwoKLy8gR2VuZXJpYyBpdGVyYXRpb24KdGVtcGxhdGU8c2l6ZV90IGluZGV4LCBzaXplX3Qgbj4Kc3RydWN0IFR1cGxlSXRlcgp7CiAgdGVtcGxhdGU8IHR5cGVuYW1lLi4uIFRzID4KICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwgbnRoX3R5cGVfaGFzX3RpcDxpbmRleCwgVHMuLi4+Ojp2YWx1ZSAsIHZvaWQgPjo6dHlwZQogIHN0YXRpYyBJdGVyKGNvbnN0IHN0ZDo6dHVwbGU8VHMuLi4+JiB0cGwpIAogIHsKICAgIHN0ZDo6Y291dCA8PCAidGlwXG4iOwogICAgVHVwbGVJdGVyPGluZGV4ICsgMSwgbj46Okl0ZXIodHBsICk7CiAgfQoKICB0ZW1wbGF0ZTwgdHlwZW5hbWUuLi4gVHMgPgogIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCAhbnRoX3R5cGVfaGFzX3RpcDxpbmRleCwgVHMuLi4+Ojp2YWx1ZSAsIHZvaWQgPjo6dHlwZQogIHN0YXRpYyBJdGVyKGNvbnN0IHN0ZDo6dHVwbGU8VHMuLi4+JiB0cGwpIHsKICAgIHN0ZDo6Y291dCA8PCAibm8gdGlwXG4iOwogICAgVHVwbGVJdGVyPGluZGV4ICsgMSwgbj46Okl0ZXIodHBsICk7CiAgfQp9OwoKLy8gQmFzZSBjbGFzcywgd2UndmUgcmVhY2hlZCB0aGUgdHVwbGUgZW5kCnRlbXBsYXRlPHNpemVfdCBuPgpzdHJ1Y3QgVHVwbGVJdGVyPG4sIG4+CnsKICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUcyA+CiAgc3RhdGljIHZvaWQgSXRlciggY29uc3Qgc3RkOjp0dXBsZTxUcy4uLj4mIHRwbCApIHsKICAgIHN0ZDo6Y291dCA8PCAiZW5kXG4iOwogIH0KfTsKCi8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IGZvcndhcmRzIHRoZSBmaXJzdCBjYWxsIHRvIFR1cGxlSXRlcjw+OjpJdGVyCnRlbXBsYXRlPHR5cGVuYW1lLi4uIFRzPgp2b2lkIGl0ZXJhdGUoY29uc3Qgc3RkOjp0dXBsZTxUcy4uLj4gJnR1cCkgewogICAgVHVwbGVJdGVyPDAsIHNpemVvZi4uLihUcyk+OjpJdGVyKHR1cCk7Cn0KCmludCBtYWluKCkgewogICAgQSBhOwogICAgQiBiOwogICAgWiB6OwogICAgc3RkOjp0dXBsZTxjb25zdCBBJixjb25zdCBCJixjb25zdCBaJj4gdHVwKGEsYix6KTsKICAgIGl0ZXJhdGUodHVwKTsKfQo=