Вы можете достичь этого, используя SFINAE. Вы добавляете дополнительный параметр шаблона к неспециализированному шаблону, а затем убедитесь, что он соответствует вашей специализации для определенного условия.
template <typename T, std::size_t dim, typename = void>
struct vector;
template <std::size_t dim>
struct vector<float, dim, std::enable_if_t<(dim <= 4)>>
{
// I want this implementation for dim <= 4
};
template <std::size_t dim>
struct vector<float, dim, std::enable_if_t<(dim > 4)>>
{
// I want this implementation for dim > 4
};
int main() {
vector<float, 3> v1; // should instantiate first one
vector<float, 7> v2; // should instantiate second one
}
std::enable_if_t
по умолчанию выведет void
, если переданное ему условие истинно. В противном случае это не приведет к чему-либо, что приведет к сбою замещения, оставляя путь для любого другого шаблона для сопоставления.
std::enable_if_t
требуется c++14
, но вы можете использовать typename std::enable_if<condition>::type
, поскольку c++11
.