非类型模板结构的成员结构的重载副本分配运算符

磁力计

我有以下非类型模板:

template<size_t MAX_SIZE>
struct Path{
    struct Point{
        float x;
        float y;
       }
    };
    Point segment[MAX_SIZE];
};

如果我现在声明两个不同的路径,则我无法将不同段的元素彼此分配,因为这些结构可能具有相同的结构,但类型不同:

Path<10> path_a ;
Path<30> path_b ;
path_a.segment[0].x = 1;
path_a.segment[0].y = 2;
path_b.segment[0] = path_a.segment[0]; // <- error C2679 in Visual Studio)

当然,如果我将“点”和“路径”的定义分开,则分配将起作用:

struct Point{
        float x;
        float y;
       };

template<size_t MAX_SIZE>
struct Path{
    Point segment[MAX_SIZE];
};

但这不是我想要的(这只是MWE),所以我想知道如何重载复制赋值运算符以使其正常工作。我尝试了多种变体,例如:

template<size_t MAX_SIZE>
struct Path{
    struct Point{
        float x;
        float y;
        template<size_t OTHER_SIZE>
        Point & operator = (const typename Path<OTHER_SIZE>::Point & that)
        {
            x = that.x;
            y = that.y;
            return *this;
        }
    };
    Point segment[MAX_SIZE];
};

但我总是会遇到同样的错误。所以我的问题是:是否可以在不更改结构布局的情况下以允许以下形式赋值的方式重载=?

path_b.segment[0] = path_a.segment[0];
Angew不再为SO感到骄傲

是的,这样的设置是可能的。核心是需要一个赋值运算符模板,该模板将接受所有类型:

template<class T>
Point & operator = (const T & that)

作为一个基本的解决方案,这就足够了。现在,它将与所有具有成员xy兼容类型的类型一起使用,并为没有类型的类型产生(通常)难看的错误消息。

如果这对您足够好,我们已经完成。

如果赋值运算符还有其他重载,则可能需要有选择地禁用模板之一。为此,您将需要检测Point类并使用SFINAE

template<size_t MAX_SIZE>
struct Path{
    struct Point{
        float x;
        float y;
        struct EnableAssignment {};
    };
    Point segment[MAX_SIZE];
};

然后按以下方式使用检测:

template<class T, class U = typename T::EnableAssignment>
Point & operator = (const T & that)

[简化的现场示例]


上面的代码在函数模板中使用默认模板参数,该模板仅在C ++ 11中引入。在此之前,您将必须以其他方式调用SFINAE:

template <class L, class R>
struct SfinaeThenRight
{
  typedef R type;
};

template <class T>
typename SfinaeThenRight<typename T::EnableAssignment, Point&>::type operator = (const T & that)

[简化的C ++ 98实时示例]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板结构中定义的成员结构的重载运算符<<

来自分类Dev

模板结构中定义的成员结构的重载运算符<<

来自分类Dev

模板结构中的重载运算符

来自分类Dev

重载副本分配运算符

来自分类Dev

当重载`std :: ostream`运算符时,是否可以更改默认非类型模板参数?

来自分类Dev

模板化副本分配运算符

来自分类Dev

C ++从重载的副本分配运算符中调用默认的副本分配运算符

来自分类Dev

结构的运算符重载

来自分类Dev

为什么引用类型成员导致隐式声明的副本分配运算符被删除

来自分类Dev

重载的运算符=返回void是否不可能是副本分配运算符?

来自分类Dev

具有非类型模板的结构的C ++实例化

来自分类Dev

模板中定义的副本分配运算符被编译器删除

来自分类Dev

具有非类型参数的 C++ 模板类:如何重载赋值运算符?

来自分类Dev

副本分配运算符何时调用?

来自分类Dev

C ++运算符<重载结构

来自分类Dev

模板类分配运算符重载

来自分类Dev

嵌套结构的运算符重载仅用作成员或朋友功能

来自分类Dev

嵌套结构的运算符重载仅用作成员或朋友功能

来自分类Dev

带有继承的重载成员函数的指针的非类型模板参数

来自分类Dev

带有继承的重载成员函数的指针的非类型模板参数

来自分类Dev

N维结构的重载运算符[]

来自分类Dev

在哪里声明结构运算符重载

来自分类Dev

如何在结构中重载'=='运算符?

来自分类Dev

带映射的结构的ostream运算符重载

来自分类Dev

分配运算符重载

来自分类Dev

模板运算符重载

来自分类Dev

有没有正当理由不从副本分配运算符返回* this?

来自分类Dev

为什么我的副本分配运算符从未调用过?

来自分类Dev

删除副本分配运算符的VS 2015 Update 3错误

Related 相关文章

  1. 1

    模板结构中定义的成员结构的重载运算符<<

  2. 2

    模板结构中定义的成员结构的重载运算符<<

  3. 3

    模板结构中的重载运算符

  4. 4

    重载副本分配运算符

  5. 5

    当重载`std :: ostream`运算符时,是否可以更改默认非类型模板参数?

  6. 6

    模板化副本分配运算符

  7. 7

    C ++从重载的副本分配运算符中调用默认的副本分配运算符

  8. 8

    结构的运算符重载

  9. 9

    为什么引用类型成员导致隐式声明的副本分配运算符被删除

  10. 10

    重载的运算符=返回void是否不可能是副本分配运算符?

  11. 11

    具有非类型模板的结构的C ++实例化

  12. 12

    模板中定义的副本分配运算符被编译器删除

  13. 13

    具有非类型参数的 C++ 模板类:如何重载赋值运算符?

  14. 14

    副本分配运算符何时调用?

  15. 15

    C ++运算符<重载结构

  16. 16

    模板类分配运算符重载

  17. 17

    嵌套结构的运算符重载仅用作成员或朋友功能

  18. 18

    嵌套结构的运算符重载仅用作成员或朋友功能

  19. 19

    带有继承的重载成员函数的指针的非类型模板参数

  20. 20

    带有继承的重载成员函数的指针的非类型模板参数

  21. 21

    N维结构的重载运算符[]

  22. 22

    在哪里声明结构运算符重载

  23. 23

    如何在结构中重载'=='运算符?

  24. 24

    带映射的结构的ostream运算符重载

  25. 25

    分配运算符重载

  26. 26

    模板运算符重载

  27. 27

    有没有正当理由不从副本分配运算符返回* this?

  28. 28

    为什么我的副本分配运算符从未调用过?

  29. 29

    删除副本分配运算符的VS 2015 Update 3错误

热门标签

归档