#include <iostream>
#include <tuple>
using namespace std;
template<unsigned TAG_VALUE>
struct tagged_struct {
constexpr static auto S_TAG = TAG_VALUE;
};
template<typename Tuple, size_t TAG, size_t I = std::tuple_size<Tuple>::value - 1>
struct tag_to_index {
constexpr static auto value = std::tuple_element<I, Tuple>::type::S_TAG == TAG ? I : tag_to_index<Tuple, TAG, I - 1>::value;
};
template<typename Tuple, size_t TAG>
struct tag_to_index<Tuple, TAG, -1> { constexpr static auto value = -1; };
int main() {
tuple<tagged_struct<15>, tagged_struct<17>, tagged_struct<29>> structs;
cout << tag_to_index<decltype(structs), 17>::value << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTx1bnNpZ25lZCBUQUdfVkFMVUU+CnN0cnVjdCB0YWdnZWRfc3RydWN0IHsKCWNvbnN0ZXhwciBzdGF0aWMgYXV0byBTX1RBRyA9IFRBR19WQUxVRTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFR1cGxlLCBzaXplX3QgVEFHLCBzaXplX3QgSSA9IHN0ZDo6dHVwbGVfc2l6ZTxUdXBsZT46OnZhbHVlIC0gMT4Kc3RydWN0IHRhZ190b19pbmRleCB7Cgljb25zdGV4cHIgc3RhdGljIGF1dG8gdmFsdWUgPSBzdGQ6OnR1cGxlX2VsZW1lbnQ8SSwgVHVwbGU+Ojp0eXBlOjpTX1RBRyA9PSBUQUcgPyBJIDogdGFnX3RvX2luZGV4PFR1cGxlLCBUQUcsIEkgLSAxPjo6dmFsdWU7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUdXBsZSwgc2l6ZV90IFRBRz4Kc3RydWN0IHRhZ190b19pbmRleDxUdXBsZSwgVEFHLCAtMT4geyBjb25zdGV4cHIgc3RhdGljIGF1dG8gdmFsdWUgPSAtMTsgfTsKCmludCBtYWluKCkgewoJdHVwbGU8dGFnZ2VkX3N0cnVjdDwxNT4sIHRhZ2dlZF9zdHJ1Y3Q8MTc+LCB0YWdnZWRfc3RydWN0PDI5Pj4gc3RydWN0czsKCQoJY291dCA8PCB0YWdfdG9faW5kZXg8ZGVjbHR5cGUoc3RydWN0cyksIDE3Pjo6dmFsdWUgPDwgZW5kbDsKCQoJcmV0dXJuIDA7Cn0=