使操作员特定于超载上下文
Making an Operator Overload context specific
我在业余时间正在学习有关C 的知识,并且我正在实现一个超载下注/ []
运算符的类。现在,我希望能够将两个或多个参数传递给下标运算符,如下所示(由逗号分隔(:
myObject[i,j,...]
,例如,参数可以为 string
s或 int
s
我发现C 不允许下标操作员接受多个参数。但是,我阅读了有关该线程中逗号运算符的超载,这是对该"问题"的替代解决方案。
在示例中,使用非常特定的签名和两个自定义Enum
S对逗号运算符的负载过载,但是我可以看到,对于常规类型对的逗号运算符超载不是一个好主意(这是我的用例(。
我对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);
}
}
演示
作为替代方案,您可以使用常规方法,operator ()
方法(可以采用多个参数(,使用std::pair
/std::tuple
作为参数(这需要在呼叫站点上额外包含{}
(。
否,不可能仅在特定上下文中超载运算符。您仍然可以根据操作员的类型限制其使用。
超载运算符时,您要指定哪些类型有效与此操作员一起使用。因此,最好使用类定义的类型进行设计是一个好主意。
class YourClass
{
public:
class YourType{};
};
pair<YourClass::YourType, YourClass::YourType> operator , (YourClass::YourType p1, YourClass::YourType p2)
{
return make_pair(p1, p2);
}
但是,如果您需要某种形式的概括,则可以使用模板和模板专业化。
相关文章:
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 寻找地理和伤害意味着超载
- 没有可行的超载'='用于shared_ptr
- "专业化不参与超载"
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 安排带有上下文的协同程序
- 我的文件无法正常工作,无法从C++文件中读取上下文
- DCMTK 了解"DIMSE 没有有效的演示上下文 ID"错误
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- antlr 规则上下文是否可以独立于目标
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- 使操作员特定于超载上下文
- 超载功能没有上下文类型信息