c++ - 使运算符重载上下文特定

标签 c++ operator-overloading comma-operator

我在业余时间学习 C++,我正在实现一个重载下标/[] 运算符的类。现在,我希望能够将两个或多个参数传递给下标运算符,如下所示(以逗号分隔):

myObject[i,j,...],其中参数例如可以是 stringint

我发现 C++ 不允许下标运算符接受一个以上的参数。但是,我在 this thread 中读到了有关重载逗号运算符的信息。 ,作为该“问题”的替代解决方案。

在示例中,逗号运算符使用非常具体的签名重载,具有两个自定义 Enum,但我可以看到为一般类型对重载逗号运算符不是一个好主意(这将是我的用例)。

由于我对 C++ 的了解有限,这让我很好奇是否完全有可能将“范围”或逗号运算符重载的使用限制在特定情况或上下文中,例如,仅在下标运算符重载中定义,为我提供我感兴趣的功能,而不会在其他地方造成干扰。

最佳答案

您不能将常规函数/运算符限制在上下文中,但由于命名空间,您可以按范围限制它。

enum class E {A, B};

struct C
{
    int operator [](const std::pair<E, E>& p) const
    {
        return data[static_cast<int>(p.first) * 2 + static_cast<int>(p.second)];
    }
    std::array<int, 4> data{{1, 2, 3, 4}};
};

namespace comma
{
    std::pair<E, E> operator , (E lhs, E rhs) { return { lhs, rhs }; }
}

int main()
{
    C c;

    {
        using namespace comma; // operator , is valid here.

        std::cout << c[E::A, E::B] << std::endl;
        auto p = (E::A, E::B); // but also here :/ p = {E::A, E::B}
        static_cast<void>(p);
    }
    {
        std::cout << c[E::A, E::B] << std::endl; // result in c[E::B]
        auto p = (E::A, E::B); // p = E::B
        static_cast<void>(p);
    }
}

Demo

作为替代方案,您可以使用常规方法,operator () 方法(可以带多个参数),使用 std::pair/std::tuple 作为参数(这需要在调用站点额外包含 {})。

关于c++ - 使运算符重载上下文特定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43799485/

相关文章:

c# - 在 Windows 8(C++ 或 .NET/C#)中的 WinRT 上动态执行代码?

javascript - 逗号运算符什么时候有用?

c++ - 逗号运算符如何工作

javascript - 逗号运算符在参数列表中返回第一个值而不是第二个值?

c# - 如何使乘法运算符(*)表现为短路?

class - Haskell 自定义数学类型和类

C++将继承的类传递给期望基类的函数

c++ - 为什么类的析构函数在只包含类的头文件的cpp中是 "inlined"

c++ - 编译器添加引用运算符

c++ - 迭代 vector 并将迭代器实际指向的对象添加为 map 中的键