gpt4 book ai didi

c++ - 如何仅为实现模板所需的一些参数编写模板特化

转载 作者:行者123 更新时间:2023-11-27 23:02:14 25 4
gpt4 key购买 nike

我有一个名为 Vector2 的结构,它的模板参数为 T。

(vector2.h)

template <typename T>
struct Vector2
{
T Values[2];

// ..... methods .....
};

我有一个名为 abs() 的方法,它是大多数类型的 std::abs() 函数的包装器。

(我的数学.h)

template <typename T>
static T abs(const T value)
{
return std::abs<T>(value);
}

如果我尝试将 vector2 结构传递给 abs() 它不会工作,因为 std 中使用的模板特化不包含它的方法......显然,我创建了它:)

我想创建一个。

如何为采用需要自身模板参数的结构的方法创建模板特化?

这是我最好的猜测,但它不是有效的语法。有可能吗?

(我的数学.cpp)

template <typename T>
static Vector2<T> abs<Vector2<T>>(const Vector2<T>& vector)
{
return vector.abs(); //this exists
}

最佳答案

函数模板只能完全特化。您不能部分特化函数模板。但是,您可以专门化类模板并拥有 static此类中的成员:

template <typename T>
struct abs_helper {
static T abs(T const value) { return std::abs(value); }
};
template <typename T>
struct abs_helper<Vector2<T>> {
static Vector2<T> abs(Common::Vector2<T> const& matrix) { return matrix.abs(); }
};

template <typename T>
auto abs(T&& value)
-> decltype(abs_helper<std::remove_const_t<std::remove_reference_t<T>>>::abs(std::forward<T>(value))) {
return abs_helper<std::remove_const_t<std::remove_reference_t<T>>>::abs(std::forward<T>(value));
}

转发有点复杂,因为您的代码使用不同的方法为两个不同的函数传递参数:代码试图模仿这种转发(我没有尝试编译它)。

只是解释一下发生了什么:

  1. struct abs_helper是一个可以部分特化的类模板,部分特化为 Vector2<T> .特化需要有一个名为 abs() 的静态成员采用合适的参数并返回所需的结果。
  2. 函数模板abs()只是转发到abs_helper<...>::abs(...) .因为它转发它的参数,所以它使用完美转发。不过,这种转发有一些复杂之处:
  3. abs()推导的模板参数可能包含引用和/或 const在将其传递给专门的 abs_helper 之前需要将其删除(否则将需要多个特化)。因此,删除任何引用,然后删除任何 const使用别名(std::remove_reference_t<T>std::remove_const<T>)的 C++14 类型特征。
  4. 返回类型似乎不同。为了解决这个问题,代码使用 C++11 返回类型规范并结合使用 decltype() 确定类型。以实际调用函数为准。

关于c++ - 如何仅为实现模板所需的一些参数编写模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26588739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com