gpt4 book ai didi

c++ - 模板函数的部分 typedef (`using` )

转载 作者:行者123 更新时间:2023-11-28 02:11:12 26 4
gpt4 key购买 nike

尝试使用模板实现点积函数,我编写了以下模板化函数。

template <typename T, typename R = float,
typename =
std::enable_if_t<std::is_arithmetic<decltype(std::declval<T>().x)>{}>,
typename =
std::enable_if_t<std::is_arithmetic<decltype(std::declval<T>().y)>{}>>
constexpr R dot(const T a_vector, const T b_vector)
{
return a_vector.x * b_vector.x + a_vector.y * b_vector.y;
}

我希望我的用户也能轻松使用 dot函数返回 double而不是默认的 float .这就是我使用 using 的原因“typedef” dot() .

template<typename T, typename R, typename ... >
using dotd = dot<T, double>;

这段代码产生

  • 在 g++ error: ‘dot<T, float>’ does not name a type
  • 在 clang++ error: expected a type error: expected ';' after alias declaration

我可以选择使用替代函数吗?

最佳答案

您可以翻转模板参数的顺序。如果你放置 R首先,如果用户需要的话,可以很容易地为其提供不同的类型:

template <
typename R = float,
typename T,
typename =
std::enable_if_t<std::is_arithmetic<decltype(std::declval<T>().x)>{}>,
typename =
std::enable_if_t<std::is_arithmetic<decltype(std::declval<T>().y)>{}>>
constexpr R dot(const T a_vector, const T b_vector)
{
return a_vector.x * b_vector.x + a_vector.y * b_vector.y;
}

然后 dot(a, b)给你一个 float对比dot<double>(a, b)给你一个 double .我找到 dot<double>比必须查找什么要清楚得多 dotd方法。

不过,如果您使用的是 C++14,最好直接删除 R模板参数完全返回 auto .

关于c++ - 模板函数的部分 typedef (`using` ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35612459/

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