Re: determine if a type is a free function pointer
Victor Bazarov wrote:
Fei Liu wrote:
I am trying to experiment with typetraits such that I can determine
if a type is a free function pointer type.
What's a "free function pointer"? One without the arguments? One that
is not a member of any class? One that is not a non-static member?
non class member function pointer. it could take arbitrary number of
arguments.
The following code
example works but it's not generic. As you can see, I have to
enumerate the function signatures. Is there a generic solution? (...
doesn't work btw).
Fei
#include <iostream>
using namespace std;
template <typename T>
class typetraits{
template <typename U>
struct is_free_func_ptr {
enum { result = false };
};
template <typename U>
struct is_free_func_ptr<U (*)()>{
enum { result = true };
};
template <typename U, typename V>
struct is_free_func_ptr<U (*)(V)>{
enum { result = true };
};
public:
enum { result = is_free_func_ptr<T>::result };
};
void foo() { }
void foo(int) { }
struct f{
void operator ()() const {}
};
int main(){
typedef void (*foo_fp)();
typedef int (*foo_fp2)(int);
cout << "result: " << typetraits<foo_fp>::result << endl;
cout << "result: " << typetraits<foo_fp2>::result << endl;
cout << "result: " << typetraits<void *>::result << endl;
cout << "result: " << typetraits<void>::result << endl;
cout << "result: " << typetraits<f>::result << endl;
}
What output do you expect?
in this case the code works fine. But add the following code:
void foo(int, int) {}
typedef int (*foo_fp3)(int, int);
cout << "result: " << typetraits<foo_fp3>::result << endl;
result is 0 although I expect it to be 1. I have searched the web,
books, etc. But I haven't found a generic technique to achieve what I
wanted.
#include <iostream>
using namespace std;
template <typename T>
class typetraits{
template <typename U>
struct is_free_func_ptr {
enum { result = false };
};
template <typename U>
struct is_free_func_ptr<U (*)()>{
enum { result = true };
};
template <typename U, typename V>
struct is_free_func_ptr<U (*)(V)>{
enum { result = true };
};
public:
enum { result = is_free_func_ptr<T>::result };
};
void foo() { }
void foo(int) { }
void foo(int,int) { }
struct f{
void operator ()() const {}
};
int main(){
typedef void (*foo_fp)();
typedef int (*foo_fp2)(int);
typedef int (*foo_fp3)(int,int);
cout << "result: " << typetraits<foo_fp>::result << endl;
cout << "result: " << typetraits<foo_fp2>::result << endl;
cout << "result: " << typetraits<foo_fp3>::result << endl;
cout << "result: " << typetraits<void *>::result << endl;
cout << "result: " << typetraits<void>::result << endl;
cout << "result: " << typetraits<f>::result << endl;
}