Reputation: 349
I referred to http://en.cppreference.com/w/cpp/language/typeid to write code which does different things for different types.
The code is as below and the explanation is given in the comments.
#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;
}
Why does test_template(str)
print "string" whereas test_template("Helloworld")
does not?
BTW, my g++ version is g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.
Upvotes: 19
Views: 3308
Reputation: 311068
In this call
test_template("Helloworld"); // Does not print string
the argument "Helloworld"
is a string literal that has type const char[11]
.
Because the function parameter is a referenced type
void test_template(const T &t)
^^^
then within the function the argument (more precisely the parameter) has the type const char ( &t )[11]
.
String literals in C++ have types of constant character arrays with the number of elements equal to the number of characters in string literal plus the terminating zero.
In this call
test_template(str);
the argument has type std::string
because the variable str
is declared like
string str = "ok";
^^^^^^
It was initialized by the string literal "ok"
nevertheless the object itself is of the type std::string
.
Upvotes: 21
Reputation: 65640
String literals in C++ are of type const char[N+1]
, where N
is the number of characters in the string. std::string
is a standard library class which owns a string and provides a number of operations over it. A std::string
can be constructed from a const char[N]
, but they are not the same thing.
Upvotes: 16
Reputation: 409364
String literals like "Helloworld"
are constants arrays of characters.
The std::string
class have a constructor that can take pointers to string literals, but a string literal is in itself not a std::string
object.
As a side-note, using a function like your is considered a code-smell and bad design. Use overloaded functions taking different arguments instead. That will also solve your problem with the strings.
Upvotes: 10