特化模板 class 在一种情况下表现得像浮点数

Specialize a template class to behave like a float in one case

所以,想象一个向量 class:

template <size_t size>
class Vector<size> {
    std::array<float, size> data;
    .... 
}

如果大小为 1,是否可以将模板专门化为浮点数? 类似于:

// The case of a Vector with size 1 should behave like a float
template <>
using class Vector<1> = float; 

我也想将其应用到其他 classes。 例如,将列大小为 1 的矩阵视为具有其行大小的向量。


在此先感谢您的帮助:)

您可以使用专用模板进行类型选择(请注意,别名模板不允许部分特化,因此无法只使用一个模板):

template<size_t size> struct
VectorType{ using type = VectorImpl<size>; }; // VectorImpl is your current Vector

template<> struct
VectorType<1>{ using type = float; };

// alias template
template<size_t size> using
Vector = typename VectorType<size>::type;

我现在无法查看。也许像下面这样。

template <>
class Vector<1> {
  float n;
 public:
  operator float& () { return n; }
}

您可能需要实施其他所需的运算符。

您的原始代码可能会违反 One-Definition Rule,但我相信这可能是相当等效且相对较短的替代方案:

template <std::size_t N>
struct VectorImpl {
   std::array<float, N> data;
};

template <std::size_t N>
using Vector = typename std::conditional<(N == 1), float, VectorImpl<N>>::type;

[live demo]