我有很多必须用 C++ 编写的 C# 代码。我在 C++ 方面没有太多经验。
我正在使用Visual Studio 2012进行构建。该项目是 C++ 中的静态库(不在 C++/CLI 中)。
在许多地方,他们使用String.Format,如下所示:
C#
String.Format("Some Text {0}, some other Text {1}", parameter0, parameter1);
现在,我知道以前有人问过类似的问题,但我不清楚什么是最标准/最安全的方法。
使用sprintf或printf之类的东西是否安全?我读到一些人提到他们不标准。像这样的东西?(这是 C++ 的方式,还是更多的 C 方式?)
C++(或者是C?)
char buffer [50];
int n, a=5, b=3;
n=sprintf (buffer, "Some Text %d, some other Text %d", a, b);
其他人建议做你自己的课,我看到了许多不同的实现。
目前,我有一个使用std::to_string、ostringstream、std::string.replace和std::string.find和Templates的类。我的课程相当有限,但对于我在 C# 代码中的情况,它可以工作。现在我不知道这是最有效的方法(甚至根本不正确):
C++
template <typename T>
static std::string ToString(T Number)
{
std::ostringstream stringStream;
stringStream << Number;
std::string string = stringStream.str();
return string;
};
template <typename T,unsigned S>
static std::string Format(const std::string& stringValue, const T (¶meters)[S])
{
std::string stringToReturn = std::string(stringValue);
for (int i = 0; i < S; ++i)
{
std::string toReplace = "{"+ std::to_string(i) +"}";
size_t f = stringToReturn.find(toReplace);
if(std::string::npos != f)
stringToReturn.replace(f, toReplace.length(), ToString(parameters[i]));
}
return stringToReturn;
};
//I have some other overloads that call the Format function that receives an array.
template <typename T>
static std::string Format(const std::string& stringValue, const T parameter, const T parameter2)
{
T parameters[] = {parameter, parameter2};
return Format(stringValue, parameters);
};
而且我需要我的代码同时在Linux和Windows中工作,所以我需要不同的编译器来构建它,这就是为什么我需要确保我使用的是标准方式。而且我的环境不能这么容易更新,所以我不能使用C++11。我也不能使用Boost,因为我不确定是否能够在需要它工作的不同环境中添加库。
在这种情况下我可以采取的最佳方法是什么?