#include <type_traits>
template <typename T, typename... Ts> struct contains;
template <typename T> struct contains<T> : std::false_type {};
template <typename T, typename... Ts>
struct contains<T, T, Ts...> : std::true_type {};
template <typename T, typename T2, typename... Ts>
struct contains<T, T2, Ts...> : contains<T, Ts...> {};
static_assert(contains<int, float, char, int, void*>::value, "");
static_assert(!contains<int, float*, char*, int*, void*>::value, "");
template <typename T, typename... Ts> struct get_index;
template <typename T, typename... Ts>
struct get_index<T, T, Ts...> : std::integral_constant<std::size_t, 0>
{
static_assert(!contains<T, Ts...>::value, "Duplicate T");
};
template <typename T, typename Tail, typename... Ts>
struct get_index<T, Tail, Ts...> :
std::integral_constant<std::size_t, 1 + get_index<T, Ts...>::value> {};
#if 1 // explicit error case, but you already have error without that.
template <typename T>
struct get_index<T>
{
// condition is always false, but should be dependant of T
static_assert(sizeof(T) == 0, "element not found");
};
#endif
template struct get_index<int, char, int, void>; // ok
template struct get_index<int, char, int, void, int>; // duplicated int
int main() {
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPiBzdHJ1Y3QgY29udGFpbnM7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGNvbnRhaW5zPFQ+IDogc3RkOjpmYWxzZV90eXBlIHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgY29udGFpbnM8VCwgVCwgVHMuLi4+IDogc3RkOjp0cnVlX3R5cGUge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgY29udGFpbnM8VCwgVDIsIFRzLi4uPiA6IGNvbnRhaW5zPFQsIFRzLi4uPiB7fTsKCnN0YXRpY19hc3NlcnQoY29udGFpbnM8aW50LCBmbG9hdCwgY2hhciwgaW50LCB2b2lkKj46OnZhbHVlLCAiIik7CnN0YXRpY19hc3NlcnQoIWNvbnRhaW5zPGludCwgZmxvYXQqLCBjaGFyKiwgaW50Kiwgdm9pZCo+Ojp2YWx1ZSwgIiIpOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPiBzdHJ1Y3QgZ2V0X2luZGV4OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgZ2V0X2luZGV4PFQsIFQsIFRzLi4uPiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8c3RkOjpzaXplX3QsIDA+CnsKCXN0YXRpY19hc3NlcnQoIWNvbnRhaW5zPFQsIFRzLi4uPjo6dmFsdWUsICJEdXBsaWNhdGUgVCIpOwp9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRhaWwsIHR5cGVuYW1lLi4uIFRzPgpzdHJ1Y3QgZ2V0X2luZGV4PFQsIFRhaWwsIFRzLi4uPiA6CiAgICBzdGQ6OmludGVncmFsX2NvbnN0YW50PHN0ZDo6c2l6ZV90LCAxICsgZ2V0X2luZGV4PFQsIFRzLi4uPjo6dmFsdWU+IHt9OwoKI2lmIDEgLy8gZXhwbGljaXQgZXJyb3IgY2FzZSwgYnV0IHlvdSBhbHJlYWR5IGhhdmUgZXJyb3Igd2l0aG91dCB0aGF0LiAKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBnZXRfaW5kZXg8VD4KewogICAgLy8gY29uZGl0aW9uIGlzIGFsd2F5cyBmYWxzZSwgYnV0IHNob3VsZCBiZSBkZXBlbmRhbnQgb2YgVAogICAgc3RhdGljX2Fzc2VydChzaXplb2YoVCkgPT0gMCwgImVsZW1lbnQgbm90IGZvdW5kIik7Cn07CiNlbmRpZgoKdGVtcGxhdGUgc3RydWN0IGdldF9pbmRleDxpbnQsIGNoYXIsIGludCwgdm9pZD47ICAgICAgLy8gb2sKdGVtcGxhdGUgc3RydWN0IGdldF9pbmRleDxpbnQsIGNoYXIsIGludCwgdm9pZCwgaW50PjsgLy8gZHVwbGljYXRlZCBpbnQKCmludCBtYWluKCkgewp9
prog.cpp: In instantiation of 'struct get_index<int, int, void, int>':
prog.cpp:26:43: required from 'struct get_index<int, char, int, void, int>'
prog.cpp:38:17: required from here
prog.cpp:21:2: error: static assertion failed: Duplicate T
static_assert(!contains<T, Ts...>::value, "Duplicate T");
^