c – 重载全局类型转换运算符

前端之家收集整理的这篇文章主要介绍了c – 重载全局类型转换运算符前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为了测试和显示我的库的一些功能的结果,我正在创建一组方便的功能.

我有一个执行功能,看起来像:

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

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

问题是我的一些功能不返回可转换到字符串的结果.我以为我可以简单地重载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<<对于std :: ostream并使用std :: ostringstream,但这也不是最干净的解决方案. 我想知道全局转换运算符是否真的不能重载,如果是这样,为什么.

解决方法

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

根据您想要调试的部分,您可以尝试使用元编程将执行方法转发到不同的实际实现,为打印内容的容器提供特定的实现.

为什么你不想要提供运算符<为您的类型?我认为这是惯用的解决方案.与其他语言不同,您使用转换为字符串以产生可打印结果的方法,在C中,惯用方式是提供操作符<然后使用stringstream(或boost :: lexical_cast或一些类似的解决方案)转换为基于运算符<<实现.有一个简单的实用程序类here,用于从覆盖运算符<<<如果要使用它作为起点.

原文链接:https://www.f2er.com/c/112859.html

猜你在找的C&C++相关文章