特化模板 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;
所以,想象一个向量 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;