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
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