C++:为 class 和非 class 类型定义 struct/class 模板差异

C++ : define struct/class template differenty for class and non-class types

在我的 C++ 项目中,我使用一个带有一个模板参数的简单结构模板(一个 Vec2,带有 x 和 y 属性),我需要针对两个主要用例以不同方式定义它:

这让我想到了一个问题:我如何(使用 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 将允许使用概念进行专门化。