允许多个类型按时间步长转换为文本

时间:2012-05-06 19:46:35

标签: c++ design-patterns text rendering

我正在使用我的GUI系统,我需要设计模式的帮助。

对于我的一个GUI元素,它可以包含每个时间步都需要更新的文本。但是,有几种不同类型的变量(对于文本)可以每帧更新,例如float,int,unsigned int,bool和strings。虽然我理解需要使用诸如atoi之类的东西将int转换为char *,但在考虑“优雅”解决方案时,我的问题就出现了。我曾经想过做多个枚举的事情,比如TEXT_IS_FLOATTEXT_IS_INT等,然后有SetTextAsFloat(float value)这样的函数,同时让对象在某种更新循环上,这样就可以了每时每刻都做一次转换,比如奥蒂。我担心这样做是因为代码最终看起来非常麻烦,支持很多不同的值类型,而且没有使用“良好的代码设计”。

有没有人知道我如何设计这样一个系统来更新一个对象的文本,该对象可以有多种类型的文本类型输入?该类如何存储潜在的类型变量(最好没有模板)。

1 个答案:

答案 0 :(得分:-1)

在C ++中,你有STL ostringstream,它就像一个流,但是构造一个字符串而不是写入文件。这是一个例子:

#include <sstream>  // istringstream, ostringstream, stringstream
#include <string>   // for string objects

using namespace std;  // personally I don't like std::everything...

// returns a string represented what was just updated
string build_value()
{
    int my_int;
    bool my_bool;
    float my_float;
    // the above vars are updated somehow...

    ostringstream s;  // build a string using stream syntax

    // and now the logic

   if (updated_int) {
       s << my_int;
       return s.str();  // this is a string object
   }
   else if (updated_bool) {
       s << my_bool;
       return s.str();
   }
   else if (updated_float) {
       s << my_float;
       return s.str();
   }
}

您还可以创建辅助模板函数:

template <typename T>
string type_to_string(T t)
{
    ostringstream s;
    s << t;
    return s.str();
}

适用于定义流的所有类型。