LINUX.ORG.RU

Не догоняю по частичной специализации шаблонов

 ,


1

2

Например, есть шаблон для многомерного массива:

template <typename t, size_t dim>
struct carray_base{
	carray_base<t, dim>(t* data, size_t* shape,  size_t* offset):
	data(data), shape(shape), offset(offset) {}
/*...*/
	template <typename num>
	inline carray_base<t, dim-1> operator [] (num i){
		return carray_base<t, dim-1>(data + (size_t)i*offset[0], shape+1, offset+1);
	}
/*...*/
	t*      data;
	size_t* shape;
	size_t* offset;
};
Соответственно, необходима частичная специализация на случай dim=1:
template <typename t>
struct carray_base<t, 1>{
/*...*/
	template <typename num>
	inline t& operator[](num i){
		return data[(size_t)i];
	}
/*...*/
};
Специализация отличается только одной функцией, можно ли избавиться от дублирования кода в её теле?

★★★★★

Последнее исправление: thunar (всего исправлений: 1)

По идее можно завести базовый класс с общими сущностями и методами

GPFault ★★
()

Я бы сделал так.

template <typename t, size_t dim>
struct carray_base{
/*...*/
        template <typename num>
	inline t& operator[](num i){
                if constexpr (dim == 1) {
		    return data[(size_t)i];
                } else {
                   /* реализация dim != 1 */
                }               
	}
/*...*/
};
fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)

Плюсую создание базового класса. Либо как вариант, паттерн mixin

CatsCantFly
()
    template <typename num, std::size_t d = dim,
              typename std::enable_if<(d > 1), int>::type = 0>
    carray_base<t, dim-1> operator [] (num i){
        return carray_base<t, dim-1>(data + (size_t)i*offset[0], shape+1, offset+1);
    }
    template <typename num, std::size_t d = dim,
              typename std::enable_if<(d == 1), int>::type = 0>
    t& operator [] (num i) {
        return data[(size_t)i];
    }
xaizek ★★★★★
()
10 мая 2018 г.
Ответ на: комментарий от xaizek

Спасибо. Пойду читать про enable_if.

thunar ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.