3

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.

Demo

#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;
glades
  • 3,778
  • 1
  • 12
  • 34
  • 5
    What you need is the so-called Universal Template Parameter ([P1985](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p1985r3.pdf)). – 康桓瑋 Mar 02 '23 at 15:08

0 Answers0