在C++14中(因此没有约束require
或折叠表达式,但有 SFINAE)是否有可能对类模板进行部分模板特化
template <typename ...T>
class Generic {
using Container = std::tuple<T...>;
};
对于每个模板参数都是相同类型的情况下?我需要这个,因为通用版本将使用std::tuple
容器,而专业化将使用std::array
(而不是 std::vector
,因为代码将在嵌入式环境中运行,所以我想避免堆分配)。
例如Generic<int,float,char>::Container
应该是std::tuple<int,float,char>
,而Generic<int,int,int>::Container
应该是std::array<int,3>
。
仅使用 C++14 的特性并不难实现。由于该标准放宽了对常数求值的一系列限制,我们甚至可以以一种相当易读的方式来实现它。
只需要一些帮手:
工作的关键在于
detail
命名空间。我们将谓词写成constexpr
函数,并依靠std::conditional_t
选择容器类型。由于在 C++14 中,contexpr
函数不限于单个返回语句,因此我们可以将类型包转换为initializer_list<bool>
我们立即迭代的类型。列表中的每个项目都是检查该位置的包中是否有与头部相同的类型的结果。现在,我没有像你要求的那样使用专业化,这主要是因为如果不重写主程序或添加委托,就很难做到这一点,而且我假设只有容器才重要。如果不是这样,你仍然可以重用实用程序并执行类似这样的操作
根据需要对基础进行尽可能多的专门化,并将正确的基础拉入
Generic
(也可以有共同的成员)。