I created a is_specialization_of
concept based on the type traits found here. The concept checks if a type is a specialization of a certain template. Those work well in all cases where I just have type template parameters. But in cases where I have non-type template parameters I get an error and I was wondering if is possible to extend the concepts so that they always work, regardless if the parameters are type or non-type.
#include <chrono>
#include <vector>
#include <cstdio>
// #pragma once
template <template <typename...> class, typename>
struct is_specialization : std::false_type {};
template <template <typename...> class Template, typename... Args >
struct is_specialization< Template, Template<Args...>> : std::true_type {};
template <template <typename...> class Template, typename... Args>
concept is_specialization_of = is_specialization<Template, Args...>::value;
template <std::size_t N, typename A>
struct entity
{ };
template <typename T> requires is_specialization_of<entity, T>
struct other
{
other(const T& e)
: e_{ e }
{ }
T e_;
};
int main()
{
// This doesn't work
other o{entity<2, int>()};
// The following works though
// std::vector<int> vec;
// if constexpr (is_specialization_of<std::vector, decltype(vec)>) {
// printf("Hello!\n");
// }
}
Error
<source>:20:32: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class ...> class Template, class ... Args> concept is_specialization_of'
20 | template <typename T> requires is_specialization_of<entity, T>
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:20:32: note: expected a template of type 'template<class ...> class Template', got 'template<long unsigned int N, class A> struct entity'
I tried to declare the template template parameter as auto... without luck:
template <template <auto...> class Template, auto... Args>
concept is_specialization_of = is_specialization<Template, Args...>::value;