sem*_*der 2 c++ templates template-specialization c++20
我有一个模板定义。隐约类似于以下内容:
template<std::size_t ElemSize>
struct OptimizedArray;
Run Code Online (Sandbox Code Playgroud)
对于这样的东西,为了优化它,我可能会手动将其专门化为 1 字节、2 字节等大小。然而,为了支持 3 个字节,我基本上有另一个模板,如下所示,它编译两个 Size1 和 Size2 数组:
template<size_t ElemSize1, size_t ElemSize2>
struct OptimizedDualArray;
Run Code Online (Sandbox Code Playgroud)
为了使用 3 个字节的 OptimizedArray 接口,我很乐意执行以下操作:
template<>
using OptimizedArray<3> = OptimizedDualArray<1, 2>;
Run Code Online (Sandbox Code Playgroud)
直接说,这个不行。然而,有没有办法做这样的事情呢?
您可以创建一个特征类,根据以下值定义不同的成员类型别名ElemSize
template<std::size_t ElemSize>
struct OptimizedArray;
template<size_t ElemSize1, size_t ElemSize2>
struct OptimizedDualArray;
template<std::size_t ElemSize>
struct OptimizedArrayTraits {
using type = OptimizedArray<ElemSize>;
};
template<>
struct OptimizedArrayTraits<3> {
using type = OptimizedDualArray<1, 2>;
};
template<std::size_t ElemSize>
using OptimizedArrayType =
typename OptimizedArrayTraits<ElemSize>::type;
Run Code Online (Sandbox Code Playgroud)
然后就可以通过 获取对应的数组类型OptimizedArrayType<N>
。
或者直接使用立即调用的 lambda 来“专门化”using
不同的ElemSize
#include <type_traits> // for std::type_identity
template<std::size_t ElemSize>
using OptimizedArrayType = decltype([] {
if constexpr (ElemSize == 3)
return std::type_identity<OptimizedDualArray<1, 2>>{};
else
return std::type_identity<OptimizedArray<ElemSize>>{};
}())::type;
Run Code Online (Sandbox Code Playgroud)