Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中是否有C风格的扩展方法+;? 我现在正在学习C++,我遇到了一个简单的问题:把int转换成字符串。我使用以下方法解决了这一问题: string IntToString(int Number) { stringstream Stream; Stream << Number; return Stream.str(); }_C++_Types - Fatal编程技术网

在C+中是否有C风格的扩展方法+;? 我现在正在学习C++,我遇到了一个简单的问题:把int转换成字符串。我使用以下方法解决了这一问题: string IntToString(int Number) { stringstream Stream; Stream << Number; return Stream.str(); }

在C+中是否有C风格的扩展方法+;? 我现在正在学习C++,我遇到了一个简单的问题:把int转换成字符串。我使用以下方法解决了这一问题: string IntToString(int Number) { stringstream Stream; Stream << Number; return Stream.str(); },c++,types,C++,Types,但是如何将toString()方法添加到内置类型 还是我错过了一些基本的东西? < P>作为一种选择,你可以超载运算符> P>扩展方法不受C++语言支持。理想的解决方法是一个单独的函数,正如您在IntToString中已经展示的那样 其他不推荐的替代方法(仅出于完整性考虑!)是从std::string派生一个类,并使用您自己的成员函数“扩展”它-但是从标准容器类派生是一个坏主意。您也可以编写自己的字符串类,但为什么要重新发明轮子呢?您的IntToString方法很好,所以请坚持使用。内置类型或像

但是如何将
toString()
方法添加到内置类型


<>还是我错过了一些基本的东西?

< P>作为一种选择,你可以超载<代码>运算符> P>扩展方法不受C++语言支持。理想的解决方法是一个单独的函数,正如您在
IntToString
中已经展示的那样


其他不推荐的替代方法(仅出于完整性考虑!)是从
std::string
派生一个类,并使用您自己的成员函数“扩展”它-但是从标准容器类派生是一个坏主意。您也可以编写自己的字符串类,但为什么要重新发明轮子呢?您的
IntToString
方法很好,所以请坚持使用。

内置类型或像ints这样的普通旧数据没有方法。streams的理念是,你可以从任何东西转换任何东西,而不仅仅是豆荚

您正在寻找的是boost::lexical_cast,它可以像这样工作:

int i = 12;
std::string s = boost::lexical_cast< std::string >( i );
std::string s;
s = my_own_cast< std::string >( 12 );

int i= my_own_cast< int >( s );
inti=12;
std::string s=boost::lexical_cast(i);
可以在boost库中找到它

您可以根据IntToString方法自己完成此方法的基本版本,但模板化可用于任何类型

template<typename To, typename From >
To my_own_cast(const From & f)
{
    std::stringstream stream;
    stream << f;

    To t;
    stream >> t;
    return t;
}
模板
到我自己的演员阵容(从&f开始)
{
std::stringstream;
溪流>t;
返回t;
}
这样使用:

int i = 12;
std::string s = boost::lexical_cast< std::string >( i );
std::string s;
s = my_own_cast< std::string >( 12 );

int i= my_own_cast< int >( s );
std::字符串s;
s=我自己的演员(12);
int i=我自己的演员阵容(s);

通常,据我所知,在上一个版本中,词法转换可能比仅仅使用流要复杂一些,并且在可能的情况下,尽量提高效率。已经讨论过了,我不确定它是否实现了。

我不会从basic_string/string派生任何类。这是不推荐的,字符串中没有虚拟方法,它没有虚拟析构函数(因此派生可能导致内存泄漏)

让它为你自己变得漂亮:

您可以创建一个静态类(只包含静态方法的类),以便将其全部保存在一个位置。对int、float、double等使用方法重载

class Converter {
   private:
       Converter() {}

   public:
     static string toString(int i) {
        ... your implementation ...
     }

     static string toString(float f) {
        ... same but floats.
     }
     .... other overloads ....
};

... somewhere else in your code ....

string c = Converter::toString(5);

不,你不能扩展类——在C++中,最好的方法是写免费函数,就像你正在做的一样。这些模板通常是有益的:

template <typename T>
string ToString(const T & t)
{
    stringstream Stream;
    Stream << t;
    return Stream.str();
}
模板
字符串到字符串(常量T&T)
{
溪流;

Stream它们不受支持,但唯一的缺点是稍微缺乏符号一致性。您必须编写:

SomeClass someInstance;
ToString(someInstance);
而不是:

someInstance.ToString();

这可能有点恼人,但它不是一个严重的问题。< /P>你是使用香草C++还是MFC?是什么?<代码> xToStRING()/>代码(当<代码> x<代码>是<代码> int >代码>而不是对象)比<代码> toStand(x)?(或者说:<代码> Boo::LoistalyCost(x)

--好的,最后一个已经超出了范围…
convert(x)
?对于转换函数,我从不复制源类型。ToString(int)就足够了。使用
运算符=()
可以执行类似于
常量字符串y=x
的操作。但可能不容易发现,并可能导致混淆。你确定这不会导致严重的副作用吗?@Nikko,不,我不是:-)虽然我们在一个项目中使用了它,它对我们起到了作用。你有什么具体的想法吗?打开一罐蠕虫。
std::string
在std名称空间中,但这个操作符不是。这意味着ADL(Koenig lookup)找不到它。要看到这一点,请添加一行额外的
namespace foo{y@MSalters,很好。必须小心使用名称空间。在我提到的项目中,AFAIR这是在项目最外层的名称空间中定义的,每个组件都嵌入到自己的子名称空间中,如
project::module1
等。不。不要编写自己的字符串类。这是初学者的错误!(并且不要从标准容器派生,因为它们的析构函数是虚拟的,并不意味着是虚拟的)。使用名称空间不是比使用仅具有静态函数的类更好吗?无论如何,您这样做只是为了分组。@Adrian,创建用作名称空间的伪类如何比使用名称空间更面向对象?为什么要使用专门为手头的任务设计的语言中的功能?我给出了答案NoSePACES不是专门设计的,将函数组合在一起,它们用来抵消大规模代码库和库中的命名冲突。使转换器静态类实现更符合使用C++作为面向对象语言而不使用C/C++的MISMASE。因此可以将C放置为C。例如,在其他实用程序类的命名空间中定义OnVter类。虽然很好的注释,但可能需要一个完整的讨论。我认为您对命名空间的错误,而且这个代码不是非常C++但是很好……被称为“工具箱类”。这样的方法只在Java和C#等没有自由函数的语言中有用。它们不允许自由函数,因为它不是面向对象的,但出于实用的考虑,它们允许我们避免面向对象,即静态方法。毫无疑问,静态类决不比名称空间更面向对象.这只是一种更复杂、更不清晰的方法来实现一些相同的目标。