I have a parameter pack given in a variadic template class and want to extract the first type.
Currently I do this, which works fine but is somehow cumbersome. Is it possible to do the same thing simpler? FirstEntityType
should be defined to have the type of the first type in EntityTs
. Note, I want to keep the signature of the class template. I know that it would be possible to write template<typename FirstEntityType, typename... OtherEntityTypes>
, it is however something that I don't want to do.
template<typename... EntityTs>
struct EntityContext
{
template<typename T, typename ... Ts>
struct K {
using type = T;
};
using FirstEntityType = typename K<EntityTs...>::type;
// ...
};
[edit] A template parameter pack is a template parameter that accepts zero or more template arguments (non-types, types, or templates). A function parameter pack is a function parameter that accepts zero or more function arguments. A template with at least one parameter pack is called a variadic template.
Parameter packs can only be expanded in a strictly-defined list of contexts, and operator , is not one of them. In other words, it's not possible to use pack expansion to generate an expression consisting of a series of subexpressions delimited by operator , .
Variadic templates are class or function templates, that can take any variable(zero or more) number of arguments. In C++, templates can have a fixed number of parameters only that have to be specified at the time of declaration. However, variadic templates help to overcome this issue.
You could write:
using FirstEntityType = std::tuple_element_t<0, std::tuple<EntityTs...>>;
Or you could use Boost.Mp11:
using FirstEntityType = mp_front<EntityContext>;
You may use
std::tuple_element<0, std::tuple<EntityTs...>>::type
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