【问题标题】:Lazy evaluation on templated function parameter模板化函数参数的惰性求值
【发布时间】:2012-01-12 14:07:51
【问题描述】:

我有一个用于记录的类,它不能继承 std::ostream,并且为与标准输出流相同的类型定义了 operator

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;
    }
    [...]
}

多亏了这一点,我可以记录我的类,而无需在每个类上显式复制 MyLoggingClass 的非成员运算符

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

问题是,它不是调用构造函数,然后将对象作为运算符的参数传递

当然,这个问题的一些有效解决方案包括:

  • 移除模板化操作符
  • 删除模板化运算符
  • 将要登录的对象存储在一个时间变量中,然后执行“logger

提前感谢您的宝贵时间:)

【问题讨论】:

  • 可以通过构造函数周围的额外括号来解决吗? IE。 logger &lt;&lt; (OneOfMyClasses(params));
  • 哦,我忘了说。不,它不起作用:S

标签: c++ templates operator-overloading


【解决方案1】:

我认为这是问题所在:

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

data 是非常量引用和行:

logger << OneOfMyClasses(params);

正在尝试将临时对象绑定到非常量引用。

改为:

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

【讨论】:

  • 你是对的:这是 const 的东西。处理“遗留代码”的问题之一——除了我在添加限定符后必须修复的与 const 相关的级联错误。
猜你喜欢
  • 2019-12-09
  • 2011-02-06
  • 2014-04-30
  • 1970-01-01
  • 2017-05-12
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多