Re: Is const char* an exception in a template specification?
On 18 Mai, 22:38, SG <s.gesem...@gmail.com> wrote:
On 18 Mai, 03:12, DeMarcus <use_my_alias_h...@hotmail.com> wrote:
template<class T>
class A {
[snip]
template<>
class A<const char*> {
[snip]
template<class T>
void foo( const T& t )
{
A<T> bar(t);
}
main()
{
foo( "Hello" );
}
But the code does not use my specialized const char* template.
This is because of the type deduction rules, you taking 't' by
reference, and the literal "Hello" being an lvalue of type "const char
[6]". If you let the compiler deduce the type T and take 't' by
reference it'll use T = const char[6] instead of T = const char*.
However, if you take 't' by value T is going to be a pointer to const
char.
Correction: T is deduced to be char[6]. But 't' is of type "const char
(&)[6]" because the const in "const T" propagates down to the array's
element type. A corrected version of the solution I mentioned earlier
is:
#include <iostream>
#include <cstddef>
// compile-time type transformation
template<typename T>
struct ptr_decay {typedef T type;};
template<typename T>
struct ptr_decay<T[]> {typedef T* type;};
template<typename T, std::size_t N>
struct ptr_decay<T[N]> {typedef T* type;};
template<typename T>
class A {
public:
A() {std::cout << "A<T>::A()\n";}
};
template<>
class A<const char*> {
public:
A() {std::cout << "A<const char*>::A()\n";}
};
template<typename T>
void foo(const T& t) {
// adjust type manually (array-to-pointer conversion) ...
typedef typename ptr_decay<const T>::type decayed_t;
A<decayed_t> a; // note: ^^^^^ (added const)
}
int main() {
foo("Hello");
}
This will print
A<const char*>::A()
without the need to do extra specializations of A or explicitly
specifying the template parameter T for foo or altering foo to take
the parameter by value.
Cheers!
SG
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]