我有一个具有多个模板参数的类;让我们说它看起来像这样:
template <class T, class B>
struct Vector2 : B
{
Vector2() noexcept;
constexpr explicit Vector2(T a) noexcept;
}
Run Code Online (Sandbox Code Playgroud)
模板参数 B 始终取决于 T。例如,如果 T 是floatB 将是XMFLOAT2,如果 T 是intB 将是XMINT2。为此,我创建了一个模板专业化:
template class Vector2<float, XMFLOAT2>;
template class Vector2<int32_t, XMINT2>;
template class Vector2<uint32_t, XMUINT2>;
Run Code Online (Sandbox Code Playgroud)
问题是,由于 B 始终依赖于 T,所以我想调用Vector<float>example,并且表达式应扩展为Vector<float, XMFLOAT2>。
我想过做一个类型别名,但是,我不确定如何实现这一点,因为它需要再次专门化。
template<class T> using Vector2 = Vector2<T, ??>;
Run Code Online (Sandbox Code Playgroud)
这实在是没有意义……
如何仅使用单个参数来调用具有多个模板参数的类并推导其他参数?或者有不同的方法吗?
您可以创建辅助特征:
template <typename T>
struct vector_base_class;
template <> struct vector_base_class<float> { using type = XMFLOAT2; };
template <> struct vector_base_class<int32_t> { using type = XMINT2; };
template <> struct vector_base_class<uint32_t> { using type = XMUINT2; };
template <class T>
struct Vector2 : typename vector_base_class<T>::type
{
Vector2() noexcept;
constexpr explicit Vector2(T a) noexcept;
};
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的,您可能正在寻找一种特质:
template <typename T>
struct xm_from_T;
template <class T, class B = typename xm_from_T<T>::type>
struct Vector2 : B
{
Vector2() noexcept;
constexpr explicit Vector2(T a) noexcept;
};
Run Code Online (Sandbox Code Playgroud)
然后专门化特征:
template <> struct xm_from_T<float> { using type = XMFLOAT2; };
template <> struct xm_from_T<int32_t> { using type = XMINT2; };
template <> struct xm_from_T<uint32_t> { using type = XMUINT2; };
Run Code Online (Sandbox Code Playgroud)