我制作了以下模板类
#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
{
};
如何从 Pebble 创建实例
Pebble<5, short_vector<Size>, short>
但这是语法错误
首先,您的
in_type
定义不正确,typename T
应该是第一个参数(有关替换规则的更多详细信息,请参阅 这个答案)。
其次,您不能在
Size
中使用 Pebble<5, short_vector<Size>, short>
,因为它在该上下文中不可用。因此,您必须明确向 short_vector
提供尺寸参数,如 Pebble<5, short_vector<5>, short>
中所示。
或者,您可以传递模板模板参数以避免指定两次大小。
示例:
#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