Функция делегирования / пересылки члену (состав)

Предположим, у меня есть класс

template<class T>
class Vector
{
public:
Vector() = default;

inline size_t size() const { return _vector.size(); }

private :
std::vector<T> _vector;
};

Есть ли способ делегировать функции (или операторы) _vector, во время компиляции, без накладных расходов ?

Конечно, я могу (и это то, что я делаю) переслать все, объявив все нужные мне функции, и просто вызвать соответствующую функцию для члена, как я сделал с size(),

Эта статья предложить именно то, что мне нужно. Например, используя это:

template<class T>
class Vector
{
public:
Vector() = default;

private :
std::vector<T> _vector;

public:
using _vector {
size_t size() const;
void push_back(const T&);
}
};

Компилятор затем сгенерирует соответствующий код. Но я не нашел ничего подобного, это возможно?

3

Решение

Первый путь: Вы можете наследовать std::vector<T> публично сделать возможным такое делегирование:

template<class T>
class Vector : public std::vector<T>
...

Наследовать ли std::vector или не мало дискуссионный, но тогда это твой код.


Второй способ: Если вы неравнодушны к композиции, сделайте Vector<T> объекты ведут себя как умные указатели:

template<typename T>
class Vector
{
std::vector<T> _vector;
public:
std::vector<T>* operator -> () { return &_vector; }
};
Vector<int> vi;
vi->size(); // instead of vi.size()

Третий путь: Перегрузка operator () для синтаксического сахара:

template<typename T>
class Vector
{
std::vector<T> _vector;
public:
std::vector<T>& operator ()() { return _vector; }
const std::vector<T>& operator ()() const { return _vector; }
};
Vector<int> vi;
vi().size(); // instead of vi.size()
2

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

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

По вопросам рекламы [email protected]