C++静态运算符重载

8

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

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

    Class_1[val]...

}

Class_1[val] 应该返回一个类型吗?比如你期望执行 Class_1[val] v; 吗? - Johannes Schaub - litb
1
我原本想让它生成整型值,但类型没问题。 - jameszhao00
在C++中,类型无法在类型系统中表示(只有std::type_id),我想不到任何可以静态重载的运算符。我建议,与其询问您的实现想法在C++中是否可行,不如提出这个想法旨在解决的实际问题。也许有人能够建议一个可行的实现方案。 - sbi
5个回答

14

如果您想使用内置运算符进行元编程:这是不可能的 - 内置运算符作用于运行时值,而不是编译时值。

您可以使用 boost::mpl 来实现,而不是使用内置运算符,可以使用其模板,例如at取代op[]plus<a, b>取代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;
}

5

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


1
我过去经常使用单例模式,但后来停止了,因为编写单例代码对于测试来说太麻烦了。 - jameszhao00

3

如果您的意思是操作符作用于类,那么不对。这就像说operator +可以作用于intdouble一样没有意义。操作符只是函数的语法糖,它们作用于变量(值),而不是类型。


2
如果你有一些实用类 - 只有静态成员 - 它会加载一些东西到“它自己”,然后你想以最简单的方式访问它 - 使用像 [] 这样的运算符,那么这是有意义的。 - jave.web
2
是的,补充@jave.web的评论:在类的静态作用域中存在数据的情况下,这确实是有意义的。(OP也明确提到了静态作用域。)因此,不适用于像您的示例中那样的简单算术运算,但[]、()、<<、>>等内容可能是任何复杂管理器类的完美语法糖,而不会强制使用单例实例。 - Sz.

1
不可以将运算符作为类的静态成员,应该使用常规的静态函数。

0

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

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

编译器通过__cpp_static_call_operator指示对此功能的支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接