假设我有班级
template<class T>
class Vector
{
public:
Vector() = default;
inline size_t size() const { return _vector.size(); }
private :
std::vector<T> _vector;
};
有没有办法在编译时将函数(或运算符)委托给_vector
,,而没有开销?
我当然可以(而且这就是我正在做的事情)通过声明我需要的每一个函数来转发所有内容,然后像调用size()
一样调用适当的函数给成员。
This article 正好提出我需要的东西。例如使用这个:
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&);
}
};
然后编译器将生成适当的代码。但我没有找到这样的东西,有可能吗?
答案 0 :(得分:2)
第一种方式:您可以公开继承std::vector<T>
以使此类授权成为可能:
template<class T>
class Vector : public std::vector<T>
...
是否继承std::vector
很少debatable,但那是你的代码。
<击>
第二种方式:如果你特别关注合成,那么让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()