Использовать частичную специализацию и наследование:
// Factor common code in a base class
template <size_t n, size_t m>
class MyClassTBase
{
// Put here the methods which must appear
// in MyClassT independantly of n, m
};
// General case: no extra methods
template <size_t n, size_t m>
class MyClassT : MyClassTBase<n, m>
{};
// Special case: one extra method (you can add more here)
template <size_t n>
class MyClassT<n, n> : MyClassTBase<n, n>
{
static MyClassT<n, n> SomeFunc()
{
...
}
};
Другой вариант - использовать SFINAE: std::enable_if
или его вариант:
template <size_t n, size_t m>
class MyClassT
{
template <typename EnableIf = char>
static MyClassT<n, m> SomeFunc(EnableIf (*)[n == m] = 0)
{
...
}
};
тем более многословной альтернативой (но менее удивительной, если вы не знаете о SFINAE и указателе на массивы) является
template <size_t n, size_t m>
class MyClassT
{
template <typename Dummy = char>
static MyClassT<n, m>
SomeFunc(typename std::enable_if<n == m, Dummy>::type * = 0)
{
...
}
};
Как правило, я предпочитаю подходы SFINAE, в которых есть одна или две функции-члена для включения или отключения. Как только это становится более сложным, я предпочитаю технику частичной специализации.
РЕДАКТИРОВАТЬ: Код SFINAE был неправильным, так как не было шаблонных функций. Исправлено.