使用另一个带有“使用?”之类的模板的模板专业化

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)

直接说,这个不行。然而,有没有办法做这样的事情呢?

康桓瑋*_*康桓瑋 7

您可以创建一个特征类,根据以下值定义不同的成员类型别名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)