仅使用单个参数调用具有多个参数的模板类

J.P*_*ini 5 c++ templates

我有一个具有多个模板参数的类;让我们说它看起来像这样:

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)

这实在是没有意义……

如何仅使用单个参数来调用具有多个模板参数的类并推导其他参数?或者有不同的方法吗?

Jar*_*d42 6

您可以创建辅助特征:

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)


for*_*818 6

正如评论中提到的,您可能正在寻找一种特质:

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)