C++静态运算符重载

发布于 2024-08-04 12:25:23 字数 116 浏览 6 评论 0原文

是否可以在静态上下文中重载 C++ 类运算符?例如

class Class_1{ ... }
int main()
{

    Class_1[val]...

}

Is it possible to overload C++ class operators in the static context? e.g.

class Class_1{ ... }
int main()
{

    Class_1[val]...

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

转瞬即逝 2024-08-11 12:25:23

如果您正在寻找使用内置运算符的元编程:这样的事情是不可能的 - 内置运算符对运行时值进行操作,而不是对编译时值进行操作。

您可以使用 boost::mpl 为此,不要使用内置运算符,而是使用其模板,例如 at 表示 op[]plus 表示 op+ 等。

int main() {
    using boost::mpl::vector;
    using boost::mpl::at_c;
    using boost::mpl::plus;
    using boost::mpl::int_;

    typedef vector<int, bool, char, float> Class_1;
    typedef vector< int_<1>, int_<2> > Numeric_1;

    at_c<Class_1, 0>::type six = 6;
    typedef plus<at_c<Numeric_1, 0>::type 
                ,at_c<Numeric_1, 1>::type>::type r;
    int i3[r::value] = { 4, 5, 6 };
    return ((i3[0] + i3[1] + i3[2]) * six) == 90;
}

If you are looking for metaprogramming using the built-in operator: Such a thing isn't possible - the built-in operators operate on runtime values, not on compile time values.

You may use boost::mpl for that, and instead of using the built-in operators, use its templates, like at for op[], plus<a, b> for op+ etc.

int main() {
    using boost::mpl::vector;
    using boost::mpl::at_c;
    using boost::mpl::plus;
    using boost::mpl::int_;

    typedef vector<int, bool, char, float> Class_1;
    typedef vector< int_<1>, int_<2> > Numeric_1;

    at_c<Class_1, 0>::type six = 6;
    typedef plus<at_c<Numeric_1, 0>::type 
                ,at_c<Numeric_1, 1>::type>::type r;
    int i3[r::value] = { 4, 5, 6 };
    return ((i3[0] + i3[1] + i3[2]) * six) == 90;
}
柠檬心 2024-08-11 12:25:23

我不相信这是可能的,尽管我在这方面可能是错的。我想问一下你为什么要这样做。也许您只需要在整个应用程序中使用一个实例,而不是对类而不是实例执行操作?在这种情况下,您可能应该使用单例模式

I don't believe it's possible, though I could be wrong on this front. I'd like to ask why you'd want to do this though. Rather than performing operations on a class instead of instances, perhaps you just require one instance throughout your application? In this case, you should probably be using the singleton pattern.

瘫痪情歌 2024-08-11 12:25:23

如果您的意思是运算符对类进行操作,则否。这没有意义,就像说 operator + 可以对 intdouble 进行操作一样代码>.运算符是函数的语法糖,它们对变量(值)而不是类型进行操作。

If you mean the operator operates on a class, the No. That does not make sense, it is like saying operator + may operator on int or double. Operators are syntactic sugar for functions and they operate on varibles(values) not types.

人│生佛魔见 2024-08-11 12:25:23

不可以,运算符不能是类的静态成员。请改用常规静态函数。

No, operators cannot be static members of a class. Use a regular static function instead.

望笑 2024-08-11 12:25:23

从 C++23 开始,可以重载 静态operator()。至于其他运营商:

目前还有其他运算符需要实现为非静态成员函数 - 所有一元运算符、赋值、下标、转换函数和类成员访问。我们认为能够将其中任何一个声明为静态不会有那么大的价值,因此我们目前不追求这些。

编译器使用 __cpp_static_call_operator 表示支持此功能。

As of C++23, it's possible to overload static operator(). As for other operators:

There are other operators that are currently required to be implemented as non-static member functions - all the unary operators, assignment, subscripting, conversion functions, and class member access. We do not believe that being able to declare any of these as static will have as much value, so we are not pursuing those at this time.

A compiler indicates support for this feature with __cpp_static_call_operator.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文