c++classtemplatesargumentsinstance

Make an instance from template class


I have made the following template class

#include <concepts>
#include <stddef.h>
#include <array>

template<size_t S>
using short_vector = std::array<short, S>;

template<size_t S>
using float_vector = std::array<float, S>;

template <typename T>
concept out_type = (std::same_as<T, short> || std::same_as<T, float>);

template <typename A, typename B, typename T>
concept in_type = (std::same_as<T, A> || std::same_as<T, B>);

template <size_t Size, in_type<short_vector<Size>, float_vector<Size>> I, out_type O>
class Pebble
{

    
};

How can I create an instance from Pebble

Pebble<5, short_vector<Size>, short>

but it is syntax error


Solution

  • First, your in_type definition is incorrect, typename T should be the first parameter (see this answer for more details about the substitution rules).

    Second, you can't use Size in Pebble<5, short_vector<Size>, short>, since it's not available in that context. So you must explicitly provide size parameter to short_vector, as in Pebble<5, short_vector<5>, short>.

    Alternatively, you can pass a template template parameter to avoid specifying size twice.

    Example:

    #include <concepts>
    #include <stddef.h>
    #include <array>
    
    template<size_t S>
    using short_vector = std::array<short, S>;
    
    template<size_t S>
    using float_vector = std::array<float, S>;
    
    template <typename T>
    concept out_type = (std::same_as<T, short> || std::same_as<T, float>);
    
    template <typename T, typename A, typename B>
    concept in_type = (std::same_as<T, A> || std::same_as<T, B>);
    
    template <size_t Size, in_type<short_vector<Size>, float_vector<Size>> I, out_type O>
    class Pebble
    {  
    };
    
    Pebble<5, short_vector<5>, short> a;
    
    template <size_t Size, template<size_t S> typename I, out_type O>
        requires in_type<I<Size>, short_vector<Size>, float_vector<Size>>
    class Pebble2
    {  
    };
    
    Pebble2<5, short_vector, short> b; // pass `short_vector` as template template parameter