For a small example like this, I want to only accept T
if T
is a struct/class
and reject builtin types like 'int', 'char', 'bool' etc.
template<typename T>
struct MyStruct
{
T t;
};
You can template a struct as well as a class. However you can't template a typedef. So template<typename T> struct array {...}; works, but template<typename T> typedef struct {...} array; does not.
A C++ template creates an algorithm independent of the type of data employed. So, the same algorithm, with many occurrences of the same type, can use different types at different executions. The entities of variable, function, struct, and class can have templates.
A non-type template argument provided within a template argument list is an expression whose value can be determined at compile time. Such arguments must be constant expressions, addresses of functions or objects with external linkage, or addresses of static class members.
When a data structure is used only as a format for other data structures, it is referred to as a data structure template. The new data structure is always a qualified data structure that includes all of the subfields from the original data structure.
You are looking for std::is_class
traits from <type_traits>
header. Which
Checks whether
T
is a non-union class type. Provides the member constant value which is equal totrue
, ifT
is a class type (but not union). Otherwise, value is equal tofalse
.
For instance, you can static_assert
for the template type T
like follows:
#include <type_traits> // std::is_class
template<typename T>
struct MyStruct
{
static_assert(std::is_class<T>::value, " T must be struct/class type!");
T t;
};
(See a demo)
In C++20, one can provide a concept using std::is_class
as follows too.
#include <type_traits> // std::is_class
template <class T> // concept
concept is_class = std::is_class<T>::value;
template<is_class T> // use the concept
struct MyStruct
{
T t;
};
(See a demo)
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