我正在创建一个包含许多double(或其他类型,类型无关紧要)成员的类。
class CalcParameters {
public:
CalcParameters() {}
~CalcParameters() {}
// getters and setters here
private:
double _param1;
double _param2;
...
};
在Vim中,是否有可能编写一个脚本来为每个参数自动生成公共getter和setter?
像
double param1() const { return _param1; }
void setParam1(double param1) { _param1 = param1; }
...
注意:
此代码不是来自真实代码的代码段,而只是我编写的内容用于说明问题。在我的实际工作代码中,成员被命名,setter除了归属之外还有验证逻辑。但是当与所有成员一起编写一个骨架类时,让Vim为我创建基本的getter和setter会很好。这可能吗?
答案 0 :(得分:3)
对于简单数据类,另一个不错的选择有时是使用boost::tuple
(或C ++ 0x中的std::tuple
):
typedef tuple<int, char> MyDataElement;
MyDataElement data = make_tuple(1,'c');
int whatever = get<0>(data); // 1
另外,考虑两次,您也可以考虑使用Boost Property Map。
最后,对于VIM脚本,它当然可以完成。我一直在调查一下,你可以这样做(假设你用前缀标识成员变量,比如说m_
):
:let bl = getbufline("" ,1, "$")
这将加载缓冲区的所有行,然后用包含“m _”的内容过滤它们:
:let xx = filter(bl, 'v:val =~ "m_.*"')
然后你可以研究如何从数组xx
中提取实际的变量名,依此类推。
答案 1 :(得分:2)
如果这确实是您的课程的外观,请按vector<double>
的顺序存储它们,并在size_t
内通过vector
索引提供一个获取者,以及单独的{{ 1}}使用paramCount()
测量矢量长度的方法。
答案 2 :(得分:2)
很久以前我写过ftplugin for this purpose。
想法是输入;AA
并回答Vim问你的问题。它具有原始形式的const-correctness理解(即int
将被复制,而string
将由const-ref交换)
我有一天应该重写它,因为我知道如何获取已经写入的数据成员的类型,加上几个functions aimed at converting identifiers(成员&lt; - &gt; getter&lt; - &gt; setter&lt; - &gt; ;参数&lt; - &gt;局部变量&lt; - &gt;常数/下划线分隔的单词&lt; - &gt;下/上驼峰情况)。唉,我已经被介绍到Demeter,我倾向于最大限度地减少对getter和setter的使用,因此我需要对ftplugin进行现代化。
编辑:从那时起,我为我的lh-refactor插件编写了两种新的重构方法: Extract Setter 和 Extract Getter 。如上所述,提取方法知道如何从成员变量的名称构建setter和getter的名称。
答案 3 :(得分:0)
将相关数据移至private
部分之外的public
部分。没有人说所有成员数据都必须是私有的:如果它是界面的一部分那么它应该是公开的,而那些冗长,冗余,愚蠢的瘾君子和制定者的地狱。
在编程中,如果某些事情可以通过脚本完成,那么就不应该这样做。
答案 4 :(得分:0)
是。 可以以这种方式使用Vim。
VimCasts has a relevant video描述了一种更简单的自动化过程的方法,只需要一个宏,标记和一点点的粘贴和粘贴。
但这不是我如何处理你的问题。相反,我会输入:q!
而重新开始。几乎总是使用getter和C ++中的setter风格很差,而且不可取。