У меня есть матричный класс с методом toString():
template <typename T, int rowCount, int columnCount>
class Matrix
{
//...
public:
std::string toString() const
{
// ...
}
};
Теперь я хочу специализировать toString() для случая, когда T есть Matrix, чтобы он возвращал строку в другом формате в случае
Matrix<Matrix<double, 2, 2>, 3, 3> a;
std::string s = a.toString();
сказать этот случай:
Matrix<double, 2, 2> a;
std::string s = a.toString();
Я пробовал что-то вроде этого
template <int rows, int cols>
template <typename X, int rows_inside, int cols_inside>
std::string Matrix<Matrix<X, rows_inside, cols_inside>, rows, cols>::toString() const
{
//...
}
Но это не работает.
Как я могу добиться этого эффекта?





Для этого вы можете использовать if constexpr.
template <typename, int, int>
class Matrix;
template <typename>
struct IsMatrix : std::false_type
{
};
template <typename T, int N, int M>
struct IsMatrix<Matrix<T, N, M>> : std::true_type
{
};
template <typename T, int rowCount, int columnCount>
class Matrix
{
//...
public:
std::string toString() const
{
if constexpr (IsMatrix<T>::value)
{
return "matrix";
}
else
{
return "not matrix";
}
}
};
Большое спасибо, это работает отлично. Знаете ли вы, есть ли способ добиться этого, используя только функции С++ 11.
@Julian Aßmann Я вижу по крайней мере три решения, первое из которых использует частичную специализацию и имеет две версии вашего класса, второе вы можете использовать «диспетчеризацию тегов» (передать bool базовой функции с реализацией) и третье ближайшее к «if constexpr» заключается в использовании std::enable_if. Я написал пример для третьего подхода: godbolt.org/z/Mbsnxz
Отвечает ли это на ваш вопрос? Ошибка «недопустимое использование неполного типа» с частичной специализацией шаблона