This should work:
template<int value, class T, class X>
struct Helper {
static uint64_t foo(uint64_t param) {
return Helper<value - 1, T, X>::foo(param);
}
};
template<class T, class X>
struct Helper<0, T, X> {
static uint64_t foo(uint64_t param) {
static_assert(sizeof(T) == 0, "Unsupported type combination.");
return 0;
}
};
template<>
uint64_t Helper<1, uint8_t, uint16_t>::foo(uint64_t param) {
return param * 1000;
}
template<>
uint64_t Helper<7, uint8_t, uint16_t>::foo(uint64_t param) {
return param * 7000;
}
template<int value>
class MyClass {
template<class T, class X>
uint64_t foo() {
return Helper<value, T, X>::foo(m_member);
}
uint64_t m_member;
};