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?
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
add a comment |
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
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
add a comment |
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
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
c++ typetraits if-constexpr
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
add a comment |
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
add a comment |
1 Answer
1
active
oldest
votes
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"
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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"
add a comment |
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"
add a comment |
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"
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"
answered Mar 14 at 11:56
Vittorio RomeoVittorio Romeo
59k17161305
59k17161305
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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