在静态上下文中是否可以重载C++类操作符?例如
class Class_1{ ... } int main() { Class_1[val]... }
0yg35tkg1#
从C++23开始,可以重载static operator()。对于其他运营商:目前还有其他操作符需要实现为非静态成员函数-所有一元操作符、赋值、下标、转换函数和类成员访问。我们不认为能够将其中任何一个声明为静态的会有那么大的价值,所以我们现在不追求这些。编译器通过__cpp_static_call_operator指示支持此功能。
operator()
__cpp_static_call_operator
qhhrdooz2#
如果您正在寻找使用内置运算符的元编程:这样的事情是不可能的-内置的操作符操作运行时的值,而不是编译时的值。您可以使用boost::mpl来实现,而不是使用内置的操作符,而是使用它的模板,例如at用于op[],plus<a, b>用于op+等。
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; }
egdjgwm83#
我不相信这是可能的,尽管在这方面我可能是错的。我想问你为什么要这么做。也许您只需要在整个应用程序中使用一个示例,而不是在类而不是示例上执行操作?在这种情况下,您可能应该使用the singleton pattern。
oymdgrw74#
如果你的意思是操作符对一个类进行操作,那么No。这是没有意义的,就像说operator +可以在int或double上操作一样。运算符是函数的语法糖,它们对变量(值)而不是类型进行操作。
operator +
int
double
hi3rlvi25#
不可以,操作符不能是类的静态成员。请使用常规静态函数。
5条答案
按热度按时间0yg35tkg1#
从C++23开始,可以重载static
operator()
。对于其他运营商:目前还有其他操作符需要实现为非静态成员函数-所有一元操作符、赋值、下标、转换函数和类成员访问。我们不认为能够将其中任何一个声明为静态的会有那么大的价值,所以我们现在不追求这些。
编译器通过
__cpp_static_call_operator
指示支持此功能。qhhrdooz2#
如果您正在寻找使用内置运算符的元编程:这样的事情是不可能的-内置的操作符操作运行时的值,而不是编译时的值。
您可以使用
boost::mpl
来实现,而不是使用内置的操作符,而是使用它的模板,例如at
用于op[]
,plus<a, b>
用于op+
等。egdjgwm83#
我不相信这是可能的,尽管在这方面我可能是错的。我想问你为什么要这么做。也许您只需要在整个应用程序中使用一个示例,而不是在类而不是示例上执行操作?在这种情况下,您可能应该使用the singleton pattern。
oymdgrw74#
如果你的意思是操作符对一个类进行操作,那么No。这是没有意义的,就像说
operator +
可以在int
或double
上操作一样。运算符是函数的语法糖,它们对变量(值)而不是类型进行操作。hi3rlvi25#
不可以,操作符不能是类的静态成员。请使用常规静态函数。