繁体   English   中英

重载全局类型转换运算符

[英]Overloading the global type conversion operator

为了测试和显示我的库的某些功能的结果,我正在创建一组方便的功能。

我有一个execute函数,看起来像:

template <typename R, typename I>
std::string execute( const std::string& func_name, R(*func_ptr)( const I& ), const I& func_input );

它调用该函数,并在格式化的字符串中显示结果和参数,我可以将其发送到std::cout

问题是我的一些函数没有返回convertible-to-string结果。 我以为我可以简单地重载global ::operator std::string ,例如:

template <typename T>
operator std::string( const std::vector<T>& v );

但海湾合作委员会抱怨说:

error: 'operator std::string(const std::vector<T, std::allocator<_CharT> >&)' must be a nonstatic member function

好吧,问题当然是我不能将成员运算符添加到std::vector ,甚至对于我的类,我也不想用“for testing”转换运算符来污染它们。

我想我可以添加一个间接层并使用函数而不是转换运算符,但这不是更美观的解决方案。 我也可以重载::operator << for std::ostream并使用std::ostringstream ,但这也不是最干净的解决方案。

我想知道全局转换运算符是否真的不能超载,如果是,为什么呢。

转换运算符(强制转换运算符)必须是生成转换类型的可转换类的成员。 作为赋值运算符,它们必须是成员函数,正如编译器告诉您的那样。

根据您希望将多少工作量放入调试部分,您可以尝试使用元编程将执行方法转发到不同的实际实现,为将打印内容的容器提供特定的实现方法。

为什么你不想为你的类型提供operator<< 我认为这实际上是惯用的解决方案。 与使用转换为字符串以产生可打印结果的方法的其他语言不同,在C ++中,惯用方法是提供operator<<然后使用stringstreams (或boost::lexical_cast或类似的解决方案)来转换为基于operator<<字符串operator<<实施。 这里有一个简单的实用程序类用于从覆盖operator<<元素创建一个string ,如果你想将它用作起点。

我想知道全局转换运算符是否真的不能超载,如果是,为什么呢。

不,没有这样的事情。 转换函数必须是类的成员。 如果不是这样,那么通过引入歧义会使重载决策成为编译器特别棘手的问题。

没有用户定义的全局转换运算符。 您必须控制目标类型(在这种情况下,非显式的一个参数构造函数是转换运算符)或源类型(在这种情况下,您必须重载成员运算符target())。

不幸的是,没有全球铸造运营商这样的东西。 出奇。 但模板是你的朋友。

有时您不希望将转换暴露给接口,而是希望仅针对特定实现保持匿名。 我通常在类中添加一个模板as()方法,它也可以在强制转换等中进行类型检查,并让你处理你想要实现强制转换的方式(例如dynamic,shared,ref等)。

像这样的东西:

    template< class EvtT >const EvtT& as() const throw( std::exception )
    {
        const EvtT* userData = static_cast<const EvtT*>( m_UserData );
        ASSERT( userData, "Fatal error! No platform specific user data in input event!" );
        return *userData;
    }

m_UserData是一个匿名类型,只有实现知道。 虽然这是严格的非类型转换(我不在这里使用类型cecks),但可以用dynamic_cast和正确的转换异常代替。

实现只是这样做:

    unsigned char GetRawKey( const InputEvent& ie )
    {
        const UserEvent& ue = ie.as<const UserEvent>();
        ...

转换函数必须是成员函数。 该函数可能未指定返回类型,参数列表必须为空。 它们应该谨慎使用,并且应该有一种从一种类型到另一种类型的明确转换路径。 否则他们可能会导致意想不到的结果和神秘的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM