Rephrased Question
I found that my original question wasn't clear enough and the repliers misunderstood my problem. So let me try to clarify:
Let's say I have two classes:
struct C { void(*m_func)(C*); };
struct D { std::function<void(D*)> m_func; };
Now I want to make a generic version of the two, so I do something like this:
template<typename Func>
struct G
{
Func m_func;
};
But now I don't know how to instantiate this class:
G<void(*)(G*)> c; //error
G<std::function<void(G*)>> d; //error
G<void(*)( G<void(*)(G<???>*)> *)> c; //???
G<std::function<void( G<std::function<void(G<???>*)>> *)>> d; //???
Original Question:
Hi,
I have a template class that can take a function pointer or a std::function object as its parameter. All is fine until that function uses a pointer of the template class in its signature:
#include <functional>
template<typename Func>
class C
{
public:
C() {}
Func m_func;
};
void foo()
{
C<void(*)(C*)> c;
C<std::function<int(C*)>> d;
}
Relevant compiler errors:
error C2955: 'C' : use of class template requires template argument list
error C3203: 'function' : unspecialized class template can't be used as a template argument for template parameter 'Func', expected a real type
error C2955: 'std::tr1::function' : use of class template requires template argument list
How do it solve this problem?
You can't name the recursive template outside itself, but you can name it inside, as the parameter list is optional in a self-reference.
The problem then becomes one of telling the template how to pass itself to "something."
template< typename T >
struct fptr_taking_type { // this template is essentially a function
typedef void (*type)( T ); // from types to types, the result being
}; // the typedef
template< typename T >
struct stdfn_taking_type {
typedef function< void (*)( T ) > type;
};
template< template< typename > class F >
struct G {
typename F< G * >::type m_func; // this declares the member variable
};
...
G< fptr_taking_type > q;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With