I got a plain variadic template declaration, just like the classic one:
template <typename... Arguments>
class VariadicTemplate;
What I need to achieve is in by letting the VariadicTemplate
class do perform some type checking; the variadic template should check in some iterative form that all the arguments received should be let say of the type <Foo>
.
I have seen something similar somewhere but now I can not recognize where it was :P
struct Foo {};
#include <type_traits>
template<class T, class...>
struct are_same : std::true_type
{};
template<class T, class U, class... TT>
struct are_same<T, U, TT...>
: std::integral_constant<bool, std::is_same<T,U>{} && are_same<T, TT...>{}>
{};
template<typename... Arguments>
class VariadicTemplate
{
static_assert(are_same<Foo, Arguments...>{}, "a meaningful error message");
};
int main()
{
VariadicTemplate<Foo, Foo, Foo, Foo> v0{}; (void)v0;
VariadicTemplate<Foo, int, Foo, double> v1{}; (void)v1;
}
But something tells me you want to know if the arguments are all specializations of a class template Foo
:
template<class T, class U>
struct Foo {};
#include <type_traits>
template<template<class...> class T, class U>
struct is_template_of
{
template<class... TT>
static std::true_type test(T<TT...>*);
static std::false_type test(...);
constexpr static bool value = decltype(test((U*)nullptr)){};
};
template<template<class...> class T, class...>
struct is_template_of_N : std::true_type
{};
template<template<class...> class T, class U, class... TT>
struct is_template_of_N<T, U, TT...>
: std::integral_constant<bool, is_template_of<T,U>::value
&& is_template_of_N<T, TT...>{}>
{};
template<typename... Arguments>
class VariadicTemplate
{
static_assert(is_template_of_N<Foo, Arguments...>{},
"a meaningful error message");
};
int main()
{
VariadicTemplate<Foo<int, double>, Foo<int, int>> v0; (void)v0;
VariadicTemplate<Foo<int, double>, int> v1; (void)v1;
}
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