jeudi 2 février 2017

Get the class containing a pointer to static member function and a pointer to templated member function

Consider the following code:

#include <iostream>
#include <type_traits>
#include <typeinfo>

struct object
{
    void f0(int i) {std::cout<<i<<std::endl;}
    void f1(int i) const {std::cout<<i<<std::endl;}
    void f2(int i) volatile {std::cout<<i<<std::endl;}
    void f3(int i) const volatile {std::cout<<i<<std::endl;}
    constexpr int f4(int i) const noexcept {return i;}
    static void f5(int i) {std::cout<<i<<std::endl;}
    template <class T> void f(T i) {std::cout<<i<<std::endl;}
};

template <class T, class C>
void print_class_containing(T C::* ptr)
{
    std::cout<<"typeid(C).name() = "<<typeid(C).name()<<std::endl;
}

int main(int argc, char* argv[])
{
    std::cout<<"typeid(object).name() = "<<typeid(object).name()<<std::endl;
    print_class_containing(&object::f0);
    print_class_containing(&object::f1);
    print_class_containing(&object::f2);
    print_class_containing(&object::f3);
    print_class_containing(&object::f4);
    //print_class_containing(&object::f5); -> Not compiling
    //print_class_containing(&object::f); -> Not compiling
    return 0;
}

How to write a function, and how to call it, to print the class that is "containing" a pointer to static member function (f5), and pointer to templated member function (f)?

Currently, the compiler returns:

static_member.cpp:30:5: error: no matching function for call to 'print_class_containing'
    print_class_containing(&object::f5); // -> Not compiling
    ^~~~~~~~~~~~~~~~~~~~~~
static_member.cpp:17:6: note: candidate template ignored: could not match 'T C::*' against 'void (*)(int)'
void print_class_containing(T C::* ptr)
     ^
static_member.cpp:31:5: error: no matching function for call to 'print_class_containing'
    print_class_containing(&object::f); // -> Not compiling
    ^~~~~~~~~~~~~~~~~~~~~~
static_member.cpp:17:6: note: candidate template ignored: couldn't infer template argument 'T'
void print_class_containing(T C::* ptr)
     ^
2 errors generated.

Aucun commentaire:

Enregistrer un commentaire