tags:

views:

180

answers:

3

In the code below:

template<typename T>
struct X {};

int main()
{
  X<int()> x; // what is the type of T ?
}

What is the type of T? I saw something like this in the boost sources.

+12  A: 

Consider the function int func(). It has a function type int(void). It can be implicitly converted to pointer type as the C++ Standard says in 4.3/1, but it this case there's no need in such conversion, so T has the function type int(void), not a pointer to it.

Kirill V. Lyadvinsky
+2  A: 

Here is what I did. Though the output of code below is implementation specific, many times it gives a good hint into the type of T that we are dealing with.

template<typename T> 
struct X {
   X(){
      cout << typeid(T).name();
   }
}; 

int main() 
{ 
  X<int()> x; // what is the type of T ? 
  cout << typeid(int()).name() << endl;
} 

The output on VC++ is

int __cdecl(void)

int __cdecl(void)

Chubsdad
A: 

The type of T is a function that takes no parameters and returns int, as in:

template<typename T>
struct X {};

int foo()
{
    return 42;
}
int main()
{
  X<int()> x; // what is the type of T ?
    typedef int(foo_ptr)();
    X<foo_ptr> x2;
    return 0;
}

T in x and x2 are the same type.

John Dibling