Неоднозначный конструктор класса шаблона

Я реализую библиотеку 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, пожалуйста)

Спасибо

0

Решение

Вы можете использовать специализацию шаблона для этого:

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) сделать трюк (и это может быть полезно не только для построения).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector