模板化函数参数的延迟评估

时间:2012-01-12 14:07:51

标签: c++ templates operator-overloading

我有一个用于记录的类,它不能继承std :: ostream,并且有运算符<<为与标准输出流PLUS模板化版本相同的类型定义:

class MyLoggingClass {
[...]
public:
    template<typename T> MyLoggingClass & operator<<( T& data ){ ... }
}

此外,对于我的程序中的每个可打印类,我都定义了典型的非成员函数:

std::ostream & operator << ( std::ostream & os, const OneOfMyClasses & foo );

问题是,在内部,我的记录器有时使用标准输出流,这是:

template<typename T>
MyLoggingClass & operator<<( T& data )
{
    [...]
    if( someCondition )
    {
        cout << data;
    }
    [...]
}

由于这个原因,我可以记录我的类,而无需在每个类上明确地复制非成员运算符&lt;&lt;对于MyLoggingClass。 问题来自于我尝试记录“动态”创建的对象:

MyLoggingClass logger;
logger << OneOfMyClasses(params); // Here I am invoking the constructor of class "OneOfMyClasses"

问题是,不是调用构造函数,而是将对象作为运算符&lt;&lt;的参数传递,它解释我正在尝试将指针记录到函数。

当然,针对此问题的一些有效解决方案包括:

  • 删除模板化运算符&lt;&lt;,并使MyLoggingClass扩展std :: ostream
  • 删除模板化运算符&lt;&lt;,并创建大量非成员运算符&lt;&lt;(MyLoggingClass&amp;,const OneOfMyClasses&amp;)
  • 存储对象以登录时态变量,然后执行“logger&lt;&lt; temporalObject;” 但是,我想知道是否有办法强制编译器评估构造函数调用。你知道这种情况的解决方法吗?

提前感谢您的时间:)

1 个答案:

答案 0 :(得分:6)

我认为这是问题所在:

template<typename T> MyLoggingClass & operator<<( T& data ){ ... }

data是非const引用和行:

logger << OneOfMyClasses(params);

正在尝试将临时绑定绑定到非const引用。

更改为:

template<typename T> MyLoggingClass & operator<<(const T& data ){ ... }
                                               //^^^^^