有一个特定于Microsoft的扩展,它可以定义属性getter和setter,如下所示:
// declspec_property.cpp
struct S {
int i;
void putprop(int j) {
i = j;
}
int getprop() {
return i;
}
__declspec(property(get = getprop, put = putprop)) int the_prop;
};
int main() {
S s;
s.the_prop = 5;
return s.the_prop;
}
有没有办法用clang或gcc来定义属性声明属性?如果我搜索__declspec
,我找到的只是__declspec(dllexport)
,但我并不是在寻找它。
4条答案
按热度按时间pnwntuvh1#
虽然C不支持智能可重写运算符(也没有gcc扩展),但该语言允许您使用其现有特性来实现它。
下面的示例(并不假定涵盖所有情况!)显示了使用原生C 11或更高版本的可能解决方案。
我们可以使用虚拟覆盖来覆盖属性,但这不是敕勒智能属性在其他语言(如swift、C#等)中的工作方式,因此,我使用lambda来为setter和getter注入覆盖代码。
编译如下内容:
c++ -std=c++11 test.cpp -o test
运行时间:
./test
个nimxete22#
clang具有支持
请参见我的示例:https://godbolt.org/z/PobB_3
尽管您必须使用
-fdeclspec
或-fms-extensions
打开它zlhcx6iw3#
是的,
查看此链接
__declspec(property(get=..,put=..))
完全受 clang 支持,这是 gcc 对此Microsoft语言功能的支持的延续。我用它所有的时间在 clang;它对于封装和重构是极好的。我帮助调试和促进了正确的 clang 实现。
它在优化数组访问器属性方面做得很好。
其中,
foo
为它还可以很好地处理模板化函数,使其成为高效重载和前向引用的理想选择。
唯一 * 令人沮丧 * 的是,您不能使用现代c++自定义属性的简写:
因此,我使用以下 * 模式 *:
或
-Wattributes
控制有关[[msvc::...]]
未定义的警告。使用该模式,我的代码既为将来做好了准备,而且读起来更干净、更一致。*给定的属性只在instances上有效。将它们放在类型上的技术是在类型上使用空的singleton:
gmxoilav4#
Moshe Gottlieb的优秀答案可以通过以下代码进行改进,以便在编译时允许只读或只写属性。