我正在尝试编写一个覆盖给定类的某些函数的模板类.一个简单的例子最好描述我正在尝试做的事情......
#include <iostream>
using namespace std;
class box{
public:
void print(){ cout << "Good!"; }
};
template <class T>
class shadow{
T obj;
public:
T& operator. (void) { return obj; }
};
int main(void){
shadow<box> t;
t.print();
}
Run Code Online (Sandbox Code Playgroud)
检查主要我想做什么.我想通过模板类模拟对一个box'方法的调用.这似乎是运营商'.' 不能超载.我设法得到的最接近的是重载operator().
T& operator() (void) { return obj; }
Run Code Online (Sandbox Code Playgroud)
并在main中调用t().print().你能提出一个更好的方法去做我想做的事吗?提前致谢.
ps:我真的必须这样做,我不想使用继承.
一种选择是过载T* operator->和/或T& operator*():
template <class T>
class shadow{
T obj;
public:
T* operator->() { return &obj; }
const T* operator->() const { return &obj; }
};
Run Code Online (Sandbox Code Playgroud)
我T& operator*()为了简洁而省略了,尽管两者都有意义.然后像这样使用它:
int main()
{
shadow<box> t;
t->print();
}
Run Code Online (Sandbox Code Playgroud)
或者,提供转换运算符operator T&();,并t使用模板参数类型的参数传递给函数:
template <class T>
class shadow{
T obj;
public:
operator T&() { return obj; }
operator const T&() const { return obj; }
void foo(const box& b)
{
b.print(); // Note: you need to make box::print() a const member function
}
int main()
{
shadow<box> t;
foo(t);
}
Run Code Online (Sandbox Code Playgroud)