c++ template specialization-specific 声明

标签 c++ templates

基本上,我想做的是构建一个 Vector 模板,它有两个参数:维度和变量类型。

template <typename Type, unsigned ElementCount>
class TVector
    {
    private:
    public:
        union
            {
            struct
                {
                Type X, Y, Z, W;
                };
            struct
                {
                Type Red, Green, Blue, Alpha;
                };
            Type Values[ElementCount];
            };
    }

一切正常,但您可能已经注意到,这仅适用于 4 元素 vector ,因为只有 Values 变量依赖于 ElementCount。 ElementCount=1 仅声明 X 和 Red,2 声明 Y 和 Green,依此类推... 所以,我想要的是根据 ElementCount 值声明其他变量。

有可能吗?我不这么认为,但无论如何都想确定一下。

我正在考虑单独声明整个 union 并将其作为模板参数传递,但这太丑陋了......

编辑: 该死的。现在我想起来了……关于按值构造函数呢?

参数计数依赖于模板参数 ElementCount...如何做到这一点?

最佳答案

您可以通过部分特化来做到这一点。有点像

template<typename T, unsigned N>
struct S
{
    union
    {
        struct
        {
            T X, Y, Z, W;
        };

        struct
        {
            T Red, Green, Blue, Alpha;
        };

        T Values[N];
    };
};

template<typename T>
struct S<T, 1>
{
    union
    {
        struct
        {
            T X;
        };

        struct
        {
            T Red;
        };

        T Values[1];
    };
};

int main()
{
    using S1 = S<char, 1>;
    using S5 = S<char, 5>;

    std::cout << "sizeof(S1) = " << sizeof(S1) << '\n';
    std::cout << "sizeof(S5) = " << sizeof(S5) << '\n';
}

它应该打印

sizeof(S1) = 1
sizeof(S5) = 5

Also, doing e.g.

S1 s1;
s1.Y = 0;

应该给你一个结构没有成员 Y 的错误。

是的,要编写(或复制粘贴)的内容要多得多,但它应该可以解决您的问题。

关于c++ template specialization-specific 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27803186/

相关文章:

c++ - 将浮点十进制值转换为分数

c++ - 有没有一种优雅的方式来桥接 Asio 中的两个设备/流?

c++ - 什么是 C++ bool myVar : 1?

C++17,为什么自动非类型模板参数不能与 SFINAE 一起使用

c++ - 如何使用 std::vector<std::mutex> 之类的东西?

c++ - boost spirit x3 : parse into structs

python - 使用 python 反向模板

c++ - 这个自动模板推导指南正确吗?

c++ - 模板类型后的星号 '*' 是什么意思?

c++ - 如何使特征接受参数包?