C++:为 class 和非 class 类型定义 struct/class 模板差异
C++ : define struct/class template differenty for class and non-class types
在我的 C++ 项目中,我使用一个带有一个模板参数的简单结构模板(一个 Vec2,带有 x 和 y 属性),我需要针对两个主要用例以不同方式定义它:
- 类型是 class,在这种情况下,我需要特殊的构造函数来初始化两个实例,这两个实例将通过将参数转发给 class
的构造函数来保存
- 类型不是 class(例如任何数字类型、指针等),在这种情况下,我希望能够使用聚合初始化,据我所知,对于具有用户定义的构造函数的 class/struct 是不可能的。
这让我想到了一个问题:我如何(使用 C++17)对我的 class 进行两种不同的定义,一种用于 class 类型,另一种用于其他类型?我可以只对 class 类型进行某种部分特化吗?
您可以添加额外的参数来启用 SFINAE,例如
template <typename T, typename Enabler = void>
struct Vec2
{
T x;
T y;
// ...
};
template <typename T>
struct Vec2<T, std::enable_if_t<std::is_class_v<T>>>
{
private:
T x;
T y;
public:
Vec2(T x, T y) : x(std::move(x)), y(std::move(y)) {}
// ...
};
C++20 将允许使用概念进行专门化。
在我的 C++ 项目中,我使用一个带有一个模板参数的简单结构模板(一个 Vec2,带有 x 和 y 属性),我需要针对两个主要用例以不同方式定义它:
- 类型是 class,在这种情况下,我需要特殊的构造函数来初始化两个实例,这两个实例将通过将参数转发给 class 的构造函数来保存
- 类型不是 class(例如任何数字类型、指针等),在这种情况下,我希望能够使用聚合初始化,据我所知,对于具有用户定义的构造函数的 class/struct 是不可能的。
这让我想到了一个问题:我如何(使用 C++17)对我的 class 进行两种不同的定义,一种用于 class 类型,另一种用于其他类型?我可以只对 class 类型进行某种部分特化吗?
您可以添加额外的参数来启用 SFINAE,例如
template <typename T, typename Enabler = void>
struct Vec2
{
T x;
T y;
// ...
};
template <typename T>
struct Vec2<T, std::enable_if_t<std::is_class_v<T>>>
{
private:
T x;
T y;
public:
Vec2(T x, T y) : x(std::move(x)), y(std::move(y)) {}
// ...
};
C++20 将允许使用概念进行专门化。