重载全局类型转换运算符

New*_*biZ 11 c++ operator-overloading operators

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

我有一个execute看起来像这样的函数:

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

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

问题是我的一些函数没有返回convertible-to-string结果.我以为我可以简单地用以下内容重载全局::operator std::string:

template <typename T>
operator std::string( const std::vector<T>& v );
Run Code Online (Sandbox Code Playgroud)

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

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

好吧,问题当然是我不能添加成员操作符std::vector,甚至对于我的类,我不想用"for testing"转换操作符来污染它们.

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

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

Dav*_*eas 12

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

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

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


dir*_*tly 5

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

不,没有这样的事情。转换函数必须是类的成员。如果不是这样,通过引入歧义性,这将使重载解析成为编译器特别烦人的问题。

  • 转换函数是特殊的成员函数(如ctor,dtor,op =和copy-constructor),因为它们参与转换/对象创建。见12.3。 (2认同)