为参数中的变量与字符串键入 std::string 的 id?
Type id of std::string for variable vs. string in argument?
我参考 http://en.cppreference.com/w/cpp/language/typeid 编写了针对不同类型执行不同操作的代码。
代码如下,注释中给出解释
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
void test_template(const T &t)
{
if (typeid(t) == typeid(double))
cout <<"double\n";
if (typeid(t) == typeid(string))
cout <<"string\n";
if (typeid(t) == typeid(int))
cout <<"int\n";
}
int main()
{
auto a = -1;
string str = "ok";
test_template(a); // Prints int
test_template("Helloworld"); // Does not print string
test_template(str); // Prints string
test_template(10.00); // Prints double
return 0;
}
为什么 test_template(str)
打印 "string" 而 test_template("Helloworld")
不打印?
顺便说一句,我的g++版本是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.
像 "Helloworld"
这样的字符串文字是字符常量数组。
std::string
class 有一个构造函数可以接受指向字符串文字的指针,但字符串文字本身不是 std::string
对象。
作为旁注,使用像您这样的函数被认为是代码异味和糟糕的设计。改用采用不同参数的重载函数。这也将解决您的字符串问题。
C++ 中的字符串文字是 const char[N+1]
类型,其中 N
是字符串中的字符数。 std::string
是一个标准库 class,它拥有一个字符串并提供了一些对其的操作。 std::string
可以从 const char[N]
构造,但它们不是一回事。
在本次通话中
test_template("Helloworld"); // Does not print string
参数 "Helloworld"
是类型为 const char[11]
的字符串文字。
因为函数参数是引用类型
void test_template(const T &t)
^^^
然后在函数内,参数(更准确地说是参数)的类型为 const char ( &t )[11]
。
C++ 中的字符串文字具有常量字符数组类型,其元素数等于字符串文字中的字符数加上终止零。
在本次通话中
test_template(str);
参数的类型为 std::string
因为变量 str
声明为
string str = "ok";
^^^^^^
它是由字符串文字 "ok"
初始化的,但是对象本身是 std::string
.
类型
我参考 http://en.cppreference.com/w/cpp/language/typeid 编写了针对不同类型执行不同操作的代码。
代码如下,注释中给出解释
#include <iostream>
#include <typeinfo>
using namespace std;
template <typename T>
void test_template(const T &t)
{
if (typeid(t) == typeid(double))
cout <<"double\n";
if (typeid(t) == typeid(string))
cout <<"string\n";
if (typeid(t) == typeid(int))
cout <<"int\n";
}
int main()
{
auto a = -1;
string str = "ok";
test_template(a); // Prints int
test_template("Helloworld"); // Does not print string
test_template(str); // Prints string
test_template(10.00); // Prints double
return 0;
}
为什么 test_template(str)
打印 "string" 而 test_template("Helloworld")
不打印?
顺便说一句,我的g++版本是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.
像 "Helloworld"
这样的字符串文字是字符常量数组。
std::string
class 有一个构造函数可以接受指向字符串文字的指针,但字符串文字本身不是 std::string
对象。
作为旁注,使用像您这样的函数被认为是代码异味和糟糕的设计。改用采用不同参数的重载函数。这也将解决您的字符串问题。
C++ 中的字符串文字是 const char[N+1]
类型,其中 N
是字符串中的字符数。 std::string
是一个标准库 class,它拥有一个字符串并提供了一些对其的操作。 std::string
可以从 const char[N]
构造,但它们不是一回事。
在本次通话中
test_template("Helloworld"); // Does not print string
参数 "Helloworld"
是类型为 const char[11]
的字符串文字。
因为函数参数是引用类型
void test_template(const T &t)
^^^
然后在函数内,参数(更准确地说是参数)的类型为 const char ( &t )[11]
。
C++ 中的字符串文字具有常量字符数组类型,其元素数等于字符串文字中的字符数加上终止零。
在本次通话中
test_template(str);
参数的类型为 std::string
因为变量 str
声明为
string str = "ok";
^^^^^^
它是由字符串文字 "ok"
初始化的,但是对象本身是 std::string
.