有没有一种优雅的方法可以用相同的模板参数声明一组函数



例如,假设我有一个简单的2D矢量模板结构:

template <typename T>
struct Vec { T x, y; };

还有一种通用的求和方法:

template <typename T, typename U>
constexpr auto operator+(const Vec<T>& u, const Vec<U>& v) {
return Vec<decltype(u.x + v.x)>{u.x + v.x, u.y + v.y};
}

但我必须为所有其他基本操作(-、*、/等(重写template <typename T, typename U>

template <typename T, typename U>
{
constexpr auto operator+(const Vec<T>& u, const Vec<U>& v) { /* ... */ };
constexpr auto operator-(const Vec<T>& u, const Vec<U>& v) { /* ... */ };
/* ... */
}

此外,正如本线程中所说,当auto嵌套在decl说明符中时,是不允许的,这意味着下面的解决方案是无效的(即使它以某种方式编译(:

constexpr auto operator+(const Vec<auto>& u, const Vec<auto>& v) { /* ... */ }

您可以通过内联定义运算符来保存一个模板参数:

template <typename T>
struct Vec {
T x, y; 
template<class U> auto operator+(Vec<U> const& v)
{ return Vec<decltype(x + v.x)>{x + v.x, y + v.y};}
template<class U> auto operator-(Vec<U> const& v)
{ return Vec<decltype(x - v.x)>{x - v.x, y - v.y};}
};

如果你完全想避免编写重复的代码,宏将是避免这种情况的一种方法(这是否是一种好的做法,以及它是否有助于或干扰理解代码,可能是品味和上下文的问题(

最新更新