std::is_member_function_pointer does not compile if falseIs it possible to write a template to check for a function's existence?What does the explicit keyword mean?std::wstring VS std::stringWhy is “using namespace std” considered bad practice?How to print function pointers with cout?C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?Visual C++ 10.0 bug in std::reference_wrapper?std::async call of member functionstd::atomic_is_lock_free(shared_ptr<T>*) didn't compileCompiling an application for use in highly radioactive environmentsHow does “std::cout << std::endl;” compile?

What to do when eye contact makes your coworker uncomfortable?

Is this part of the description of the Archfey warlock's Misty Escape feature redundant?

What does Apple's new App Store requirement mean

Why is the Sun approximated as a black body at ~ 5800 K?

How can I write humor as character trait?

Why can't the Brexit deadlock in the UK parliament be solved with a plurality vote?

How to explain what's wrong with this application of the chain rule?

Change the color of a single dot in `ddot` symbol

Multiplicative persistence

Is this toilet slogan correct usage of the English language?

How to convince somebody that he is fit for something else, but not this job?

Merge org tables

Why is it that I can sometimes guess the next note?

How does electrical safety system work on ISS?

What does "Scientists rise up against statistical significance" mean? (Comment in Nature)

"It doesn't matter" or "it won't matter"?

Which was the first story featuring espers?

How do I fix the group tension caused by my character stealing and possibly killing without provocation?

Why is so much work done on numerical verification of the Riemann Hypothesis?

How to get directions in deep space?

C++ copy constructor called at return

Which Article Helped Get Rid of Technobabble in RPGs?

Why does AES have exactly 10 rounds for a 128-bit key, 12 for 192 bits and 14 for a 256-bit key size?

awk assign to multiple variables at once



std::is_member_function_pointer does not compile if false


Is it possible to write a template to check for a function's existence?What does the explicit keyword mean?std::wstring VS std::stringWhy is “using namespace std” considered bad practice?How to print function pointers with cout?C++11 introduced a standardized memory model. What does it mean? And how is it going to affect C++ programming?Visual C++ 10.0 bug in std::reference_wrapper?std::async call of member functionstd::atomic_is_lock_free(shared_ptr<T>*) didn't compileCompiling an application for use in highly radioactive environmentsHow does “std::cout << std::endl;” compile?













9















What I am looking for: I have a templated class and want to call a function if the class has the wanted function, something like:



template<class T> do_something() 
if constexpr (std::is_member_function_pointer<decltype(&T::x)>::value)
this->_t->x(); // _t is type of T*




What happens: The compiler does not compile if T does not bring the function. Small example:



#include <type_traits>
#include <iostream>

class Foo
public:
void x()
;

class Bar ;

int main()
std::cout << "Foo = " << std::is_member_function_pointer<decltype(&Foo::x)>::value << std::endl;
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
return 0;



Compiler says:



is_member_function_pointer.cpp:17:69: error: no member named 'x' in 'Bar'; did you mean 'Foo::x'?
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;


So, what is the std::is_member_function_pointer for, when I can not use it in an if constexpr? If I just use this->_t->x() the compiler will fail, too, for sure.










share|improve this question






















  • you don't check if the type is a function pointer, you try to see a function pointer which did not exist

    – Klaus
    Mar 14 at 11:55











  • Thanks for your comment! But how can I check that?

    – jagemue
    Mar 14 at 11:56











  • stackoverflow.com/questions/257288/…

    – Klaus
    Mar 14 at 11:56











  • Possible duplicate of Is it possible to write a template to check for a function's existence?

    – Klaus
    Mar 14 at 11:56















9















What I am looking for: I have a templated class and want to call a function if the class has the wanted function, something like:



template<class T> do_something() 
if constexpr (std::is_member_function_pointer<decltype(&T::x)>::value)
this->_t->x(); // _t is type of T*




What happens: The compiler does not compile if T does not bring the function. Small example:



#include <type_traits>
#include <iostream>

class Foo
public:
void x()
;

class Bar ;

int main()
std::cout << "Foo = " << std::is_member_function_pointer<decltype(&Foo::x)>::value << std::endl;
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
return 0;



Compiler says:



is_member_function_pointer.cpp:17:69: error: no member named 'x' in 'Bar'; did you mean 'Foo::x'?
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;


So, what is the std::is_member_function_pointer for, when I can not use it in an if constexpr? If I just use this->_t->x() the compiler will fail, too, for sure.










share|improve this question






















  • you don't check if the type is a function pointer, you try to see a function pointer which did not exist

    – Klaus
    Mar 14 at 11:55











  • Thanks for your comment! But how can I check that?

    – jagemue
    Mar 14 at 11:56











  • stackoverflow.com/questions/257288/…

    – Klaus
    Mar 14 at 11:56











  • Possible duplicate of Is it possible to write a template to check for a function's existence?

    – Klaus
    Mar 14 at 11:56













9












9








9


1






What I am looking for: I have a templated class and want to call a function if the class has the wanted function, something like:



template<class T> do_something() 
if constexpr (std::is_member_function_pointer<decltype(&T::x)>::value)
this->_t->x(); // _t is type of T*




What happens: The compiler does not compile if T does not bring the function. Small example:



#include <type_traits>
#include <iostream>

class Foo
public:
void x()
;

class Bar ;

int main()
std::cout << "Foo = " << std::is_member_function_pointer<decltype(&Foo::x)>::value << std::endl;
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
return 0;



Compiler says:



is_member_function_pointer.cpp:17:69: error: no member named 'x' in 'Bar'; did you mean 'Foo::x'?
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;


So, what is the std::is_member_function_pointer for, when I can not use it in an if constexpr? If I just use this->_t->x() the compiler will fail, too, for sure.










share|improve this question














What I am looking for: I have a templated class and want to call a function if the class has the wanted function, something like:



template<class T> do_something() 
if constexpr (std::is_member_function_pointer<decltype(&T::x)>::value)
this->_t->x(); // _t is type of T*




What happens: The compiler does not compile if T does not bring the function. Small example:



#include <type_traits>
#include <iostream>

class Foo
public:
void x()
;

class Bar ;

int main()
std::cout << "Foo = " << std::is_member_function_pointer<decltype(&Foo::x)>::value << std::endl;
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
return 0;



Compiler says:



is_member_function_pointer.cpp:17:69: error: no member named 'x' in 'Bar'; did you mean 'Foo::x'?
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;


So, what is the std::is_member_function_pointer for, when I can not use it in an if constexpr? If I just use this->_t->x() the compiler will fail, too, for sure.







c++ typetraits if-constexpr






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Mar 14 at 11:52









jagemuejagemue

159110




159110












  • you don't check if the type is a function pointer, you try to see a function pointer which did not exist

    – Klaus
    Mar 14 at 11:55











  • Thanks for your comment! But how can I check that?

    – jagemue
    Mar 14 at 11:56











  • stackoverflow.com/questions/257288/…

    – Klaus
    Mar 14 at 11:56











  • Possible duplicate of Is it possible to write a template to check for a function's existence?

    – Klaus
    Mar 14 at 11:56

















  • you don't check if the type is a function pointer, you try to see a function pointer which did not exist

    – Klaus
    Mar 14 at 11:55











  • Thanks for your comment! But how can I check that?

    – jagemue
    Mar 14 at 11:56











  • stackoverflow.com/questions/257288/…

    – Klaus
    Mar 14 at 11:56











  • Possible duplicate of Is it possible to write a template to check for a function's existence?

    – Klaus
    Mar 14 at 11:56
















you don't check if the type is a function pointer, you try to see a function pointer which did not exist

– Klaus
Mar 14 at 11:55





you don't check if the type is a function pointer, you try to see a function pointer which did not exist

– Klaus
Mar 14 at 11:55













Thanks for your comment! But how can I check that?

– jagemue
Mar 14 at 11:56





Thanks for your comment! But how can I check that?

– jagemue
Mar 14 at 11:56













stackoverflow.com/questions/257288/…

– Klaus
Mar 14 at 11:56





stackoverflow.com/questions/257288/…

– Klaus
Mar 14 at 11:56













Possible duplicate of Is it possible to write a template to check for a function's existence?

– Klaus
Mar 14 at 11:56





Possible duplicate of Is it possible to write a template to check for a function's existence?

– Klaus
Mar 14 at 11:56












1 Answer
1






active

oldest

votes


















16














is_member_function_pointer doesn't detect the existence of an entity T::x, it assumes it does and returns whether or not it is a member function pointer.



If you want to detect whether it exists or not, you can use the detection idiom. Example:



#include <experimental/type_traits>

template<class T>
using has_x = decltype(&T::x);

template<class T> void do_something(T t)
if constexpr (std::experimental::is_detected<has_x, T>::value)
t.x();



struct Foo
void x()
;

struct Bar ;

int main()
do_something(Foo);
do_something(Bar);



live example on godbolt.org




I have written an article on the general problem of checking the validity of an expression in different C++ Standard versions:



"checking expression validity in-place with C++17"






share|improve this answer






















    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55161832%2fstdis-member-function-pointer-does-not-compile-if-false%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    16














    is_member_function_pointer doesn't detect the existence of an entity T::x, it assumes it does and returns whether or not it is a member function pointer.



    If you want to detect whether it exists or not, you can use the detection idiom. Example:



    #include <experimental/type_traits>

    template<class T>
    using has_x = decltype(&T::x);

    template<class T> void do_something(T t)
    if constexpr (std::experimental::is_detected<has_x, T>::value)
    t.x();



    struct Foo
    void x()
    ;

    struct Bar ;

    int main()
    do_something(Foo);
    do_something(Bar);



    live example on godbolt.org




    I have written an article on the general problem of checking the validity of an expression in different C++ Standard versions:



    "checking expression validity in-place with C++17"






    share|improve this answer



























      16














      is_member_function_pointer doesn't detect the existence of an entity T::x, it assumes it does and returns whether or not it is a member function pointer.



      If you want to detect whether it exists or not, you can use the detection idiom. Example:



      #include <experimental/type_traits>

      template<class T>
      using has_x = decltype(&T::x);

      template<class T> void do_something(T t)
      if constexpr (std::experimental::is_detected<has_x, T>::value)
      t.x();



      struct Foo
      void x()
      ;

      struct Bar ;

      int main()
      do_something(Foo);
      do_something(Bar);



      live example on godbolt.org




      I have written an article on the general problem of checking the validity of an expression in different C++ Standard versions:



      "checking expression validity in-place with C++17"






      share|improve this answer

























        16












        16








        16







        is_member_function_pointer doesn't detect the existence of an entity T::x, it assumes it does and returns whether or not it is a member function pointer.



        If you want to detect whether it exists or not, you can use the detection idiom. Example:



        #include <experimental/type_traits>

        template<class T>
        using has_x = decltype(&T::x);

        template<class T> void do_something(T t)
        if constexpr (std::experimental::is_detected<has_x, T>::value)
        t.x();



        struct Foo
        void x()
        ;

        struct Bar ;

        int main()
        do_something(Foo);
        do_something(Bar);



        live example on godbolt.org




        I have written an article on the general problem of checking the validity of an expression in different C++ Standard versions:



        "checking expression validity in-place with C++17"






        share|improve this answer













        is_member_function_pointer doesn't detect the existence of an entity T::x, it assumes it does and returns whether or not it is a member function pointer.



        If you want to detect whether it exists or not, you can use the detection idiom. Example:



        #include <experimental/type_traits>

        template<class T>
        using has_x = decltype(&T::x);

        template<class T> void do_something(T t)
        if constexpr (std::experimental::is_detected<has_x, T>::value)
        t.x();



        struct Foo
        void x()
        ;

        struct Bar ;

        int main()
        do_something(Foo);
        do_something(Bar);



        live example on godbolt.org




        I have written an article on the general problem of checking the validity of an expression in different C++ Standard versions:



        "checking expression validity in-place with C++17"







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Mar 14 at 11:56









        Vittorio RomeoVittorio Romeo

        59k17161305




        59k17161305





























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55161832%2fstdis-member-function-pointer-does-not-compile-if-false%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Moe incest case Sentencing See also References Navigation menu"'Australian Josef Fritzl' fathered four children by daughter""Small town recoils in horror at 'Australian Fritzl' incest case""Victorian rape allegations echo Fritzl case - Just In (Australian Broadcasting Corporation)""Incest father jailed for 22 years""'Australian Fritzl' sentenced to 22 years in prison for abusing daughter for three decades""RSJ v The Queen"

            Who is our nearest planetary neighbor, on average?Santa Claus flies to the South PoleSeven Spheres of Unequal Mass, a weighing problem with a twistDescribe a large integerFast Mental Calculation of $7.5^7$Math in Space (without the help of celebrities)Find the value of $bigstar$: Puzzle 8 - InequalityWho drinks beer while running anyway?A Crucial DeliveryRanking And AverageHow long will my money last at roulette?

            Daza language Contents Vocabulary Phonology References External links Navigation menudaza1242Daza"Dazaga"eeee178086576