C++运算符重载模板类

Fru*_*oul 0 c++ templates

我正在尝试编写一个覆盖给定类的某些函数的模板类.一个简单的例子最好描述我正在尝试做的事情......

#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:我真的必须这样做,我不想使用继承.

jua*_*nza 6

一种选择是过载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)