referring to yesterday's post,
this woke me up this morning. Why does this actually work? As long as the function test
is concerned, this function has no body so how can it perform anything? I want to know why and how this works? I'm REALLY interested to see your answers.
template<typename T>
class IsClassT {
private:
typedef char One;
typedef struct { char a[2]; } Two;
template<typename C> static One test(int C::*); //NO BODY HERE
template<typename C> static Two test(…); //NOR HERE
public:
enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) };
enum { No = !Yes };
};
Thanks in advance with help to understand this very interesting phenomenon.
There are two main reasons why people dislike templates: They're confusing. They can lead to long compilation times.
Substitution failure is not an error (SFINAE) refers to a situation in C++ where an invalid substitution of template parameters is not in itself an error. David Vandevoorde first introduced the acronym SFINAE to describe related programming techniques.
So the simple answer is YES.
" typename " is a keyword in the C++ programming language used when writing templates. It is used for specifying that a dependent name in a template definition or declaration is a type.
You can not get compiler error because test
-function declaration exists.
You can not get linker error because you do not call test
-function.
C++ Standart ISO/IEC 14882:2003(E)
5.3.3 Sizeof
The sizeof operator yields the number of bytes in the object representation of its operand. The operand is either an expression, which is not evaluated, or a parenthesized type-id. The sizeof operator shall not ...
...
I assume you are refering to the Yes enum? IsClassT<T>::test<T>(0)
? sizeof does not actually evaluate its arguments. That's why code like the following is legal, even though you might expect it to bail out on you:
int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
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