Предположим, у меня есть класс
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&);
}
};
Компилятор затем сгенерирует соответствующий код. Но я не нашел ничего подобного, это возможно?
Первый путь: Вы можете наследовать 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()
Других решений пока нет …