Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将常量对象引用传递给函子_C++_C++14 - Fatal编程技术网

C++ 将常量对象引用传递给函子

C++ 将常量对象引用传递给函子,c++,c++14,C++,C++14,我想创建输入事件对象到std::函数的映射。输入事件对象定义了==运算符,但由于map默认使用

我想创建输入事件对象到std::函数的映射。输入事件对象定义了==运算符,但由于map默认使用<检查相等性,并且my uses不需要排序,因此我想将compare函数设置为调用==运算符的函子。基本上,我想这样做:

#include <map>

struct Vertex
{
    int x;
    int y;

    constexpr bool operator==(const Vertex& v)
    {
        return (x == v.x) && (y == v.y);
    }
};

struct vertexCmp
{
    bool operator()(const Vertex& v1, const Vertex& v2)
    {
        return v1 == v2;
    }
};

int main()
{
    std::map<Vertex, int, vertexCmp> _vertexMap;

    Vertex v;
    v.x = 1;
    v.y = 1;

    _vertexMap[v] = 1;

    return 0;
}

我知道你不能在常量对象上调用非常量成员函数,但你会认为constexpr可以满足这个要求,对吗?我觉得我在这里想得太多了,有一种更好的方法来构造它。

在C++11中,非静态成员函数上的
constepr
隐含了
const
函数,但在C++14中没有(因为发现实际上存在
constexpr
函数的用例,其中
*此
不是
const
)。您需要

constexpr bool operator==(const Vertex& v) const

在C++11中,非静态成员函数上的
constepr
意味着一个
const
函数,但在C++14中不是这样(因为发现实际上存在
constepr
函数的用例,其中
*这个
不是
const

constexpr bool operator==(const Vertex& v) const

constexpr
const
是不同类型的“恒常性”.
constexpr
用于在编译时可能是常量的表达式。
const
不允许在运行时修改值。只需将
const
添加到
运算符==
中,如果不需要排序,则无关紧要。
std::map
需要排序才能正常工作。它无法使用相等比较。如果你做一个散列函数,你可以使用
std::unordered_-map
。我非常喜欢使用散列函数和unordered_-map的想法,实际上,我认为这是一个更好的方法。谢谢。
constexpr
const
是不同类型的“恒定性”.
constexpr
用于在编译时可能是常量的表达式。
const
不允许在运行时修改值。只需将
const
添加到
运算符==
中,如果不需要排序,则无关紧要。
std::map
需要排序才能正常工作。它无法使用相等比较。如果你做一个散列函数,你可以使用
std::unordered_-map
。我很喜欢使用散列函数和unordered_-map的想法,事实上,我认为这是一个更好的方法。谢谢。你能给这个发现提供一个链接吗?会让你的答案更完美;)虽然我将实施Benjamin Lindley的建议,而不是我最初的方法,但感谢您回答这个问题。不过,我有一个后续问题,在非常量对象上使用操作符时,使操作符为常量会导致问题吗?你能给出该发现的链接吗?会让你的答案更完美;)虽然我将实施Benjamin Lindley的建议,而不是我最初的方法,但感谢您回答这个问题。不过,我有一个后续问题,在非常量对象上使用操作符时,使操作符为常量会导致问题吗?