我正在编写一个程序,我希望能够干净利地将一个字符串用引号括起来而不必做类似的事情
std::string firstString = "This is a string";
std::string myString = "\"" + firstString + "\"";
Run Code Online (Sandbox Code Playgroud)
所以我编写了几个模板函数来获取它们的参数并将它们用引号括起来.我还包括我的第一个(天真的)尝试编写一个通用的toString()函数(我知道to_string,但我也是这样做的学习).
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <typeinfo>
template <typename T>
std::string toString(const T &convert)
{
std::string returnString{""};
std::stringstream transfer;
transfer << convert;
transfer >> returnString;
return returnString;
}
template<typename T>
std::string tQuoted(const T &convert)
{
std::cout << "Called template overload" << std::endl;
return ("\"" + toString(convert) + "\"");
}
template<typename T>
std::string tQuoted(const std::string &convert)
{
std::cout << "Called std::string overload" << std::endl;
return ("\"" + convert + "\"");
}
template<typename T>
std::string tQuoted(const char *convert)
{
std::cout << "Called const char overload" << std::endl;
return ("\"" + static_cast<std::string>(convert) + "\"");
}
template<typename T>
std::string tQuoted(std::string convert)
{
std::cout << "Called normal std::string overload" << std::endl;
return ("\"" + convert + "\"");
}
template<typename T>
std::string tQuoted(std::string&& convert)
{
std::cout << "Called rvalue std::string overload" << std::endl;
return ("\"" + convert + "\"");
}
int main()
{
std::vector<std::string> my{"Hello", "30 Days Of Coding", "All Work And No Play"};
std::string myString = "Hello, World!";
std::string *strPtr = &myString;
std::string *mySuperPtr = new std::string{"He's a cockaroach"};
for (std::vector<std::string>::const_iterator iter = my.begin(); iter != my.end(); iter++) {
std::cout << tQuoted(*iter) << std::endl;
}
std::cout << tQuoted(myString) << std::endl;
std::cout << tQuoted(*strPtr) << std::endl;
std::cout << tQuoted(mySuperPtr) << std::endl;
std::cout << tQuoted(std::string{"Another string"}) << std::endl;
delete mySuperPtr;
mySuperPtr = nullptr;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中每一个都调用模板构造函数:
Called template overload
"Hello"
Called template overload
"30"
Called template overload
"All"
Called template overload
"Hello,"
Called template overload
"Hello,"
Called template overload
"0x13cad10"
Called template overload
"Another"
Run Code Online (Sandbox Code Playgroud)
当然,一个不太天真的toString()方法会做基本的检查,看看参数是否是一个std :: string,如果是的话,只返回它.似乎std :: stringstream在遇到字符串中的第一个空格时会停止(因此截断输出).但是,这不是我困惑的主要焦点.
对不起这个非常基本的问题,但是这个问题确实令我感到难过.感谢您的任何帮助,您可以提供.
您没有正确专门化模板功能.这是如何正确地专门化它:
template<>
std::string tQuoted(const std::string &convert)
{
std::cout << "Called std::string overload" << std::endl;
return ("\"" + convert + "\"");
}
Run Code Online (Sandbox Code Playgroud)
结果输出变为:
Called std::string overload
"Hello"
Called std::string overload
"30 Days Of Coding"
Called std::string overload
"All Work And No Play"
Called std::string overload
"Hello, World!"
Called std::string overload
"Hello, World!"
Called template overload
"0x1c27d10"
Called std::string overload
"Another string"
Run Code Online (Sandbox Code Playgroud)
请注意
tQuoted(mySuperPtr)
Run Code Online (Sandbox Code Playgroud)
mySuperPtr 是指向字符串的指针,而不是字符串,因此不使用专用模板函数.