gpt4 book ai didi

c++ - 是否有将基本类型转换为字符串的无警告模板函数

转载 作者:太空狗 更新时间:2023-10-29 21:29:43 25 4
gpt4 key购买 nike

我想提供一个将大多数基本类型转换为字符串的模板化函数。到目前为止我想出的最好的是:

template<typename T> inline std::string anyToString(const T& var) {
std::ostringstream o;
o << var;
return o.str();
}

该函数可以例如用于以下用途:

 class TimeError:public std::runtime_error{
public:
explicit TimeError(int time):std::runtime_error(anyToString(time)),
mTime(time){};
protected:
int mTime;
};

anyToString 和类似函数的问题是在使用 gcc 版本 4.4.3 编译时生成歧义警告 -Wall -Wexta -Werror“ISO C++ 说这些是模棱两可的,即使第一个最差的转换比第二个最差的转换要好

据我所知,警告的原因在于调用 << 时的隐式转换可能性。

这些歧义主要是由其他模板产生的,如下所示:

  template<typename T>
T& operator<<(T& out, const SymRad& angle){
return out << angle.deg();
}

但是这些还有其他优势,比如适用于多种流类型。所以我想保留它们。如果我将第二个模板变成一个简单的方法,例如ostream 歧义被清除,但我正在寻找某事。这允许保留两个模板。是否有一个通用函数可以提供相同的简单性,而不会使用描述的选项生成警告?如果不是,本地禁用发出的警告的最佳方法是什么?

最佳答案

看起来你会从这样的场景中得到这样的消息:

#include <sstream>
#include <string>
#include <iostream>

struct Y {};
struct X
{
operator Y() const {return Y(); }
};

std::ostream& operator<< (std::ostream& os, X) { return os << "X"; }
std::ostream& operator<< (std::ostringstream& os, Y) { return os << "Y"; }

template<typename T> inline std::string anyToString(const T& var) {
std::ostringstream o;
o << var;
return o.str();
}

int main()
{
std::cout << anyToString(X()) << '\n';
}

我建议使用 -pedantic旗帜代替。由于编译器扩展,GCC 完全可以编译它,对于其他编译器,这将是一个直接的错误。


关于你的补充:

  template<typename T>
T& operator<<(T& out, const SymRad& angle){
return out << angle.deg();
}

But those have other advantages like working for several stream types.

这实际上不适用于多种流类型。例如,如果 Tstringstream , 然后 out << angle.deg();可能会返回对 ostream 的引用不能隐式向下转换回 stringstream引用。

关于c++ - 是否有将基本类型转换为字符串的无警告模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4195764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com