【问题标题】:C++ template friend operators vs additional template argumenC++ 模板友元运算符与附加模板参数
【发布时间】:2014-01-04 15:50:19
【问题描述】:

我创建了一个 Vector 类,它将元素数量和元素类型作为模板参数。

template<int n, class T>
class Vector
{
    public:
        T data[n];

        Vector()
        : data{}
        {
        }

        Vector(T const value)
        {
            std::fill_n(data, n, value);
        }

        template<class ...U, typename std::enable_if<sizeof...(U) == n, int>::type = 0>
        Vector(U &&...u)
        : data{std::forward<U>(u)...}
        {
        }

        T& operator[](int const index)
        {
            return data[index];
        }

        template<class U>
        operator Vector<n, U>()
        {
            Vector<n, U> out;

            std::copy_n(data, n, out.data);

            return out;
        } 
};

我想要类的运算符,但是为了让它们在具有不同元素类型的向量之间进行转换,它们需要是在类体内声明和定义的友元函数。但我也想为向量 2、3 和 4 提供 3 个专门的模板类。因为我不想在每个类主体内编写所有运算符 4 次。我可以将此运算符与右侧向量的元素类型的附加模板参数一起使用吗?

template<int n, class T, class U>
inline Vector<n, T>& operator+=(Vector<n, T> &lhs, Vector<n, U> const &rhs)
{
    for(int i = 0; i < n; ++i)
    {
        lhs.data[i] += rhs.data[i];
    }

    return lhs;
}

人们在类中使用友元运算符而不是这样做可能是有原因的,但到目前为止似乎还不错,我是否忽略了什么?

【问题讨论】:

    标签: c++ class templates operator-overloading


    【解决方案1】:

    除了部分的总和之外,这里没有任何东西。 “朋友”用于授予操作员可能想要使用的非公共成员的访问权限,并将定义放在类中可以节省键入时间(并隐式使它们内联,避免单一定义规则问题)。如果你正在拼凑一个类,你可以开始输入一个“朋友...”运算符定义,甚至不用慢下来考虑它是否需要成为朋友。有些人可能还喜欢在类中列出运算符——它确实可以更容易地确保在有人查看类以查看哪些函数可用时看到它们——但程序员通常习惯于在类之后查找运算符....

    如果您的代码有效,一切都很好。

    【讨论】:

    • 'friend' 不仅仅如此。我的问题类似于 stackoverflow.com/questions/8890051/… 。运算符函数需要能够将浮点向量和整数向量相加。但是模板参数推导发生在隐式类型转换之前。我没有使用该问题的解决方案,而是创建了此解决方法。我想知道如果我使用该问题的解决方案,我的解决方法是否会导致任何不会发生的问题。
    • 该答案并不能说明您谈论的朋友的必要性-例如,将值成员公开,以及涵盖一般加法情况的两参数模板,以下代码可以正常工作: ideone.com/0hMp83 - 这是显而易见的方法,而且确实 - 这不是您在问题中要问的吗? - 我不会称之为“解决方法”。
    • 进一步 - 该答案有一个带有template &lt;class U&gt; foo(const foo&lt;U&gt;&amp; that) : _value(that.getval()) {} 的模板 - 它在+ 运算符启动之前强制一个额外的向量的痛苦隐式构造。你最好在你的答案中使用代码.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    相关资源
    最近更新 更多