从模板类创建实例

问题描述 投票:0回答:1

我制作了以下模板类

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

但这是语法错误

c++ class templates arguments instance
1个回答
0
投票

首先,您的

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
© www.soinside.com 2019 - 2024. All rights reserved.