c++ - 基于非类型参数的存在的类模板重载?

标签 c++ c++11 templates

我有一个这样的模板化类:

template <typename T, std::size_t maxSize>
class Foo
{
    std::array<T, maxSize> arr; 
};
我想做一个重载,您可以选择只传递T并获得一个 vector 作为基础容器:
template <typename T>
class Foo
{
    std::vector<T> arr; 
};
正确的方法是什么?

最佳答案

您可以使用参数包作为大小,并专门处理1个参数或0个参数:
首先,提供一个无法编译的默认值

template <typename T>
struct always_false : std::false_type {};

template <typename T, std::size_t... Is>
class Foo {
    static_assert(always_false<T>::value, "too many sizes");
};
然后,部分专用于一个或零个参数:
template <typename T, std::size_t maxSize>
class Foo<T, maxSize> {
public:
    std::array<T, maxSize> arr;
};

template <typename T>
class Foo<T>
{
public:
    std::vector<T> arr;  
};
演示:https://godbolt.org/z/5bW9c7

关于c++ - 基于非类型参数的存在的类模板重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64362157/

相关文章:

c++ - c中的非阻塞输入

c++ - 来自 std::any 的 std::is_reference

c++ - 使用 Boost 的无锁 spsc_queue 时如何编译?

c++ - C++中的多线程: The correct way to join threads

具有可变数字或参数的函数的 C++ 静态编译

c++ - 嵌套概念多态模板

c++ - 当外部类被模板化时嵌套类的外联构造函数

c++ - google/dense_hash_map的线程安全

c++ - 一个类的成员可以被命名为与其类型(另一个类)相同的名称吗?

c++ - 无效的模板实例和元程序编译正常?