gpt4 book ai didi

c++ - 为什么传递给模板函数的 std::string 对象不喜欢 std::string 重载?

转载 作者:太空狗 更新时间:2023-10-29 23:43:54 26 4
gpt4 key购买 nike

我正在编写一个程序,我希望能够将字符串干净地用引号括起来,而不必执行类似

的操作
std::string firstString = "This is a string";
std::string myString = "\"" + firstString + "\"";

所以我写了几个模板函数来获取它们的参数并将它们用引号引起来。我还包括了我第一次(天真的)尝试编写一个通用的 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;

}

它们中的每一个都调用模板构造函数:

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"

当然,一个不那么天真的 toString() 方法会进行基本检查以查看参数是否为 std::string,如果是则返回它。似乎 std::stringstream 在遇到字符串中的第一个空格时会停止(因此输出被截断)。然而,这不是我困惑的主要焦点。

很抱歉这个非常基本的问题,但是这个问题真的让我很困惑。感谢您提供的任何帮助。

最佳答案

您没有正确特化模板函数。这是正确专门化它的方法:

template<>
std::string tQuoted(const std::string &convert)
{
std::cout << "Called std::string overload" << std::endl;
return ("\"" + convert + "\"");
}

结果输出变为:

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"

注意对于

tQuoted(mySuperPtr) 

mySuperPtr 是一个指向字符串的指针,而不是字符串,因此它不使用专门的模板函数。

关于c++ - 为什么传递给模板函数的 std::string 对象不喜欢 std::string 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com