模板运算符<<绕过去

时间:2013-04-03 15:58:08

标签: c++ templates operators operator-overloading

在库代码中我有:

class VeryStrictClass
{
public:
    template<typename UNKNOWN_TYPE>
    VeryStrictClass& operator<<(const UNKNOWN_TYPE & value) {
        struct can_not_format_unknown_type {};
        can_not_format_unknown_type error = value;
    }
};

无法重新实现它。

这禁止声明像

这样的函数
template <typename MsgType>
/*check toString existance*/
VeryStrictClass& operator << (VeryStrictClass& o, const MsgType* msg) 
{
  BOOST_ASSERT(msg != NULL);
  return o << msg->toString();
}

其中toString()不是虚拟的。

我有很多类似的类要放入VeryStrictClass。有没有办法绕过这个约束?

1 个答案:

答案 0 :(得分:1)

您可以为自己的消息类型使用模板专门化。

class foo {};

class bar : public foo {}

template <>
VeryStrictClass& VeryStrictClass::operator<< <foo> (const foo & bar) {
    // something something
    return *this;
}

VeryStrictClass v;
bar* b = new bar;
foo* f = new foo;
v << *foo << *((foo*)bar);

不确定这是否有效

EdiT:添加了一些多态性

编辑:否则你不能。