c++ - 整数常量与类型的偏特化

标签 c++ templates partial-specialization

是否可以根据模板参数是类型还是整数常量来特化模板?这是一个无法编译但说明意图的示例:

#include <cstdio>
#include <cstddef>

// tag struct
struct DynamicSize {};

template<class T, class Size>
class Container;

template<class T>
class Container<T, DynamicSize>
{
public:
    Container() {
        std::puts("dynamic size");
    }
};

template<class T, int Size>
class Container<T, Size>
{
public:
    Container() {
        std::puts("static size");
    }
};

int main(int argc, char* argv[]) {
    Container<char, 20> a;
    Container<char, DynamicSize> b;
}

Eigen 库支持固定大小或运行时确定大小的矩阵,并执行与此类似的操作。那里的实现是模板参数始终是整数常量,动态标记只是一个等于 -1 的常量,但我很好奇是否还有其他方法。

最佳答案

我认为做到这一点的唯一方法是让 Container 模板为 Size 取一个类型参数。然后由类型负责处理它是动态的还是静态的。我认为任何特定于存储类型类型的细节都可以限制在 struct 类型中。也许下面的示例会有所帮助。

示例代码

#include <iostream>

struct DynamicSize
{
    static const int size = -1;
};

template<int Size>
struct FixedSize
{
    static const int size = Size;
};

template<class T, class Size>
class Container
{
public:
    Container()
    {
        std::cout << Size::size << "\n";
    }
};

int main()
{
    Container<char, FixedSize<20>> a;
    Container<char, DynamicSize> b;

    return 0;
}

示例输出

20
-1

Live Example

关于c++ - 整数常量与类型的偏特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37580040/

相关文章:

c++ - 使用 fsyntax-only 参数切换警告

c++ - 函数模板作为成员 - GCC 与 CLANG

C++ - 泛型类型,其中类型变量必须具有特定类型

c++ - 使 C++ 模拟类同时使用 2D 和 3D vector

C++ 模板特化 - 仅特化某些方法,其余方法使用默认 impl

c++ - 静态表生成适用于 GCC 但不适用于 clang; clang 有问题吗?

c++ - 部分模板特化 : matching on properties of specialized template parameter

c++ - 时间选择器控件的 DTM_SETFORMAT 不支持格式说明符

c++ - 运行 Magick++ 程序时内存冲突

c++ - 模板类型未定义