好的,假设我们有一行文字:
[s]tackoverflow rocks
括号在正常模式下显示光标的位置.按下后tr
,您会得到:
stackov[e]rflow rocks
现在是有趣的部分.如果你推动;
重复命令会发生什么?没有!Vim找到下一个'r'(紧靠光标右侧)并将其自身定位在其左侧(已经存在的位置).
我希望将;
光标前进到这个位置:
stackoverflow[ ]rocks
这可以通过l
在按下之前使用向右移动一个角色来实现;
,但额外的步骤是刺激性的.有一个类似的问题T
,但没有f
和F
.有没有一些方法,使;
行为我想用的方式t
和T
?
首先,一个证明问题的小例子:
struct Bar {
enum Baz {aa, bb, cc};
Baz baz_;
operator Baz() const { return baz_; }
private:
template<typename T> operator T() const;
};
int main() {
Bar bar;
switch (bar) {
case Bar::aa:
break;
case Bar::bb:
break;
case Bar::cc:
break;
default:
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用g ++ 4.7.0编译此代码会出现以下错误:
foo.cpp: In function ‘int main()’:
foo.cpp:12:16: error: ambiguous default type conversion from ‘Bar’
foo.cpp:12:16: error: candidate conversions include ‘template<class T> Bar::operator T() const’
Run Code Online (Sandbox Code Playgroud)
我的理解是,由于结构对象被"切换",编译器将尝试找到转换函数为整数或枚举类型.我明确地向Bar :: Baz枚举类型提供了一个公共转换函数,并希望它能够使用它.
令我困惑的部分是编译器还找到了私有转换函数,然后无法决定使用哪个.为什么甚至考虑私人功能?如果我添加一个显式的强制转换,比如说 …