Я реализую библиотеку N-мерного массива. Рассмотрим этот код:
template<int Rank, class Type>
class Array {
{
public:
// constructor for vectors, valid when Rank==1
Array(int dim0, Type val = Type());
// constructor for matrices, valid when Rank==2
Array(int dim0, int dim1, Type val = Type());
...
}
Проблема в том, что если Type == int
компилятор будет жаловаться на неоднозначный вызов конструктора (например, Array<1,int>(1,1)
). Есть ли трюк, как enable_if
что заставляет компилятор игнорировать конструкторы, которые не совпадают Rank
? (без C ++ 11, пожалуйста)
Спасибо
Вы можете использовать специализацию шаблона для этого:
template<int size, class Type>
class Array {
// General stuff for size > 2, if you have any
};template <class Type>
class Array<1, Type>
{
// Code for one-dimensional array
};template <class Type>
class Array<2, Type>
{
// Code for two-dimensional array
};
или даже указать это для int точно:
template <>
class Array<2, int>
{
// Code for two-dimensional integer array
};
Для них также совершенно справедливо иметь совершенно другой набор открытых интерфейсов.
Но я бы, вероятно, передать массив или std::vector
заданного размера для измерений или удалите третий аргумент, просто добавьте метод, скажем, populate(Type t)
сделать трюк (и это может быть полезно не только для построения).
Других решений пока нет …