Reputation: 117
How come std::is_class
is false
when I test it on a reference ?
int main() {
struct foo_struct {
int i1;
int i2;
};
std::cout << std::boolalpha << std::is_class<foo_struct>::value << std::endl; // true
std::cout << std::boolalpha << std::is_class<foo_struct&>::value << std::endl; // falae
}
Upvotes: 1
Views: 150
Reputation: 172964
Reference types and class types are different types; reference types are not class types themselves.
The C++ type system consists of the following types:
...
compound types (see also std::is_compound):
reference types (see also std::is_reference):
lvalue reference types (see also std::is_lvalue_reference):
rvalue reference types (see also std::is_rvalue_reference):
...
non-union types (see also std::is_class);
union types (see also std::is_union).
I'm not sure about your intent, you might apply std::remove_reference
on the type, it gives the type itself for non-reference type. So you can use it in templates for both reference or non-reference types.
std::cout << std::boolalpha << std::is_class<std::remove_reference_t<foo_struct>>::value << std::endl; // true
std::cout << std::boolalpha << std::is_class<std::remove_reference_t<foo_struct&>>::value << std::endl; // true
Upvotes: 5