小编App*_*ker的帖子

将字符串转换为数字类型的通用方法?

我有这门课:

template<typename T> class Parser
{
    public:
        Parser() : count(0) {}
        virtual void parse(const string&);
        void get_token(void);
    private:
        T result;
        char token;
        string expression;
        int count;
};
Run Code Online (Sandbox Code Playgroud)

现在这个类不是通用的,如果result有人说,a double,我会用这种方法来检测数字.

while((strchr("1234567890.",token))
{
     /* add token to a "temp" string */
     /* etc. etc. */
}

result = atof(temp.c_str());
Run Code Online (Sandbox Code Playgroud)

但既然result是通用的,我不能像使用任何方法atofatoi等.

我该怎么办?

c++ string generics types casting

0
推荐指数
1
解决办法
1935
查看次数

用C++做模板的另一种方法是什么?

当我发现这种依赖于预处理器的创建模板类的方式时,我只是搞乱了:

#include <iostream>
#include <typeinfo>

// Is this a valid template class?
#define TEMPLATE_CLASS(T)\
class TemplateClass_ ## T\
{\
private:\
    T value;\
public:\
    void print_type()\
    {\
        std::cout << typeid(T).name() << std::endl;\
    }\
}

class Sample {};

TEMPLATE_CLASS(int) obj1;
TEMPLATE_CLASS(char) obj2;
TEMPLATE_CLASS(Sample) obj3;

int main(int argc, char* argv[])
{
    obj1.print_type();
    obj2.print_type();
    obj3.print_type();
}
Run Code Online (Sandbox Code Playgroud)

我简单地编译了这个:

g++ src.cpp -o main.exe
Run Code Online (Sandbox Code Playgroud)

输出:

i
c
6Sample
Run Code Online (Sandbox Code Playgroud)

现在,正如您所看到的,它几乎与模板类的工作方式相同.除了明显的事实之外,对象只能全局声明,因为它实际上在您使用时定义了一个新的内联类TEMPLATE_CLASS(T),并且无法在函数中定义新类.解决方案可以是:

TEMPLATE_CLASS(float);

int main() { TemplateClass_float obj; }
Run Code Online (Sandbox Code Playgroud)

无论如何,这给了我很多思考.首先,这甚至可以被称为有效的泛型类吗?那么,是否可以使用它而不是标准模板功能?显然,使用标准模板功能要方便得多,但我的意思是说,这个工作也一样吗?最后,C++标准内部定义的模板功能是否与我在预处理器上做的类似?如果没有,这个实现和C++的标准模板功能有什么区别?

c++ templates template-classes

0
推荐指数
1
解决办法
166
查看次数

最大宏的安全解决方案?

我们都知道这个着名的宏观例子:

#define max(a,b) ((a) > (b) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)

而且,因为它使用ab两次,就当我们做这样的事情变得不准确:

max(x, y++); // because this gets translated to...
((x) > (y++) ? (x) : (y++)); // y is incremented twice
Run Code Online (Sandbox Code Playgroud)

Effective C++中,Scott Meyers使用inline函数为此提供了一个C++解决方案.

21世纪的C中,我希望有一个类似的C解决方案,但遗憾的是它建议避免双重使用.这让我很伤心.:'(

当然,人们总是可以用常规功能替换它.但我想知道是否有一个只有C的宏解决方案,这解决了双重使用问题.任何可能的解决方

c macros

0
推荐指数
1
解决办法
198
查看次数

函数运行时确定的参数类型?

是否可能(最好不使用任何第三方库),创建一个在C#运行时确定其类型的函数?

例如

public static void myfunc(var x)
{
     System.Windows.Forms.MessageBox.Show(x); //just an example
}
Run Code Online (Sandbox Code Playgroud)

注意:我希望运行时确定参数的类型,并且不希望稍后将参数转换为其他类型,如果我使用泛型则需要.我不想要:

 myfunc<T>(T x) 
 // and then :
 MessageBox.Show((string)m);
Run Code Online (Sandbox Code Playgroud)

更新:我实际上正在为我的编程语言创建一个函数解析器,它转换为C#代码.在我的语言中,我希望始终在运行时确定参数类型.我正在寻找一些好的C#功能,以便轻松翻译.例如,在我的语言语法中:

 function msg << x
     MessageBox.Show x
 end
Run Code Online (Sandbox Code Playgroud)

需要转换为在编译时不要求类型的东西,但在运行时需要一个类型.例如

public static void msg(var x)
{
     System.Windows.Forms.MessageBox.Show(x);
}
Run Code Online (Sandbox Code Playgroud)

.net c# runtime c#-4.0

-1
推荐指数
1
解决办法
516
查看次数

没有-o选项的g ++中的分段错误

当我编译没有g++ -o选项的程序时,它失败并出现以下错误:它所抱怨的符号都不在我的程序中.为什么它可以用-o选项编译好,但没有该选项就无法编译?

    integer: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction

-1
推荐指数
1
解决办法
625
查看次数

平台无关和跨平台有什么区别?

我见过很多C/C++库和Gui Toolkits.其中有一些像GTK +,Qt,Swing等声称与平台无关.有些人,比如WxWidgets,SWT等声称是跨平台的.起初我认为这只是一个措辞的改变,但这些术语的使用已经开始令人怀疑.什么区别?

cross-platform virtual-machine platform-independent libraries

-5
推荐指数
2
解决办法
6462
查看次数

找不到.NET错误的来源,需要帮助

我正在使用.NET Framework 2.0来编写一个2d平台游戏.我正在使用SFML .NET,因为它是跨平台并且由MONO支持并且具有成熟的API.我的问题是,虽然我的程序编译正确并且运行正常,但在关闭它时会出错.

"0x5ed0530e"处的指令引用"0x0000051c"处的存储器.内存无法"读取"

仔细调试后,我注意到在初始化SFML String2d类后出现问题.

怎么了; 关闭程序时为什么会出现此错误?即使没有任何问题,仍然可以停止接收错误,以便我的程序的用户不会被它烦恼?

使用系统; 使用SFML.Graphics; 使用SFML.Window;

namespace ProGUI
{
    class TextBox : Sprite
    {
        private String2D Text;
        public TextBox(RenderWindow App)
        {
            Image = new Image(App.Width, App.Height / 4, new Color(0, 0, 0));
            Position = new Vector2(0, App.Height - App.Height / 4);
        }

        public void SetText(string text)
        {
            Text = new String2D(text);
            Text.Font = new Font("Greyscale_Basic_Bold.ttf");
            Text.Position = new Vector2(Position.X + 5, Position.Y + 5);
            Text.Size = 12;
        }

        public string GetText()
        {
            return Text.Text; …
Run Code Online (Sandbox Code Playgroud)

.net c# 2d sfml

-6
推荐指数
1
解决办法
1105
查看次数