块嵌套太深
Blocks nested too deeply
本文关键字:嵌套 更新时间:2023-10-16
我遇到了一些不典型的问题。我让用户可以使用sendText()函数。他可以键入例如
sendText( "mytext{newline}text{up}" )
{text}是允许用户发送的一个特殊密钥。有很多特殊的钥匙可供选择。
因此,我的第一步是获取{}个括号之间的字符串,并创建:
if( _specialKey == "newline" ) {
// action for VK_RETURN
} else if( _specialKey == "up" ) {
// action for VK_UP
} else .....
示例:
if( specialKey == "n" ) {
// enter click
unsigned short key = VK_RETURN;
inputs.push_back( keyDown( key ) );
inputs.push_back( keyUp( key ) );
return 2;
} else if( specialKey == "n+" ) {
// enter down
inputs.push_back( keyDown( VK_RETURN ) );
return 2;
} else if( specialKey == "n-" ) {
// enter up
inputs.push_back( keyUp( VK_RETURN ) );
return 2;
} else if( specialKey == "t" ) {
// tabulator click
unsigned short key = VK_TAB;
inputs.push_back( keyDown( key ) );
inputs.push_back( keyUp( key ) );
return 2;
} else if( specialKey == "t+" ) {
// tabulator down
inputs.push_back( keyDown( VK_TAB ) );
return 2;
} else if( specialKey == "t-" ) {
// tabulator up
inputs.push_back( keyUp( VK_TAB ) );
return 2;
} else if( specialKey == "caps" ) {
// caps lock click
unsigned short key = VK_CAPITAL;
inputs.push_back( keyDown( key ) );
inputs.push_back( keyUp( key ) );
return 2;
} else if( specialKey == "caps+" ) {
// caps lock down
inputs.push_back( keyDown( VK_CAPITAL ) );
return 2;
} else if( specialKey == "caps-" ) {
// caps lock up
inputs.push_back( keyUp( VK_CAPITAL ) );
return 2;
} else if( specialKey == "ralt" ) {
// right alt click
unsigned short key = VK_RMENU;
inputs.push_back( keyDown( key ) );
inputs.push_back( keyUp( key ) );
return 2;
} else if( specialKey == "ralt+" ) {
// right alt down
inputs.push_back( keyDown( VK_RMENU ) );
return 2;
} else if( specialKey == "ralt-" ) {
// right alt up
inputs.push_back( keyUp( VK_RMENU ) );
return 2;
} else if( specialKey == "lalt" ) {
// right alt click
unsigned short key = VK_LMENU;
inputs.push_back( keyDown( key ) );
inputs.push_back( keyUp( key ) );
return 2;
} else if( specialKey == "lalt+" ) {
// right alt down
inputs.push_back( keyDown( VK_LMENU ) );
return 2;
} else if( specialKey == "lalt-" ) {
// right alt up
inputs.push_back( keyUp( VK_LMENU ) );
return 2;
} else if( specialKey == "rctrl" ) {
// right alt click
unsigned short key = VK_RCONTROL;
inputs.push_back( keyDown( key ) );
inputs.push_back( keyUp( key ) );
return 2;
} else if( specialKey == "rctrl+" ) {
// right alt down
inputs.push_back( keyDown( VK_RCONTROL ) );
return 2;
} else if( specialKey == "rctrl-" ) {
// right alt up
inputs.push_back( keyUp( VK_RCONTROL ) );
return 2;
} else if( specialKey == "lctrl" ) {
但是编译器说:
fatal error C1061: compiler limit : blocks nested too deeply
我解决这个问题的第一个想法是定义一个映射,它将存储映射到某个整数的所有特殊键(作为字符串)。然后我可以做:
switch( map[key] ) {
case 0:
...
}
但我不确定编译器是否也会抱怨它。有很多东西需要改变,所以我不想因为没有结果而改变它。
或者你还有其他更好的想法吗?
谢谢。
您有超过127个else if
块。虽然这应该是编译的,而且它肯定是微软C++编译器中的一个错误,但你的代码仍然有很大的问题。
您将数据存储在控制流中,这128个块中的绝大多数都是冗余的复制粘贴块。如果可能的话,你不应该这样做。将代码和数据分离,对特殊情况使用控制流,同时将所有常见情况重构为一个哈希图,将其作为一种类型处理。
您可以使用类似于map<string, int>
的映射。一个元素类似于pair<string,int>("newline", VK_RETURN>
:
map<string, int> NameToKey;
NameToKey.insert(make_pair("newline", VK_RETURN));
在交换机情况下使用相同的方法,如:
map<string,int>::const_iterator iter = NameToKey.find(_specialKey);
switch(iter->second)
{
case VK_RETURN: // Handle as "newline"
;
}
用小数位OOP代替指向函数的指针。
class ICommand
{
public:
virtual void execute() const =0;
virtual void ~ICommand(){};
};
class KeyUpCommand : public ICommand
{
DWORD key_; //not suare about win api here
public:
KeyUpCommand(key) : key_(key) {};
virtual void execute() const
{
keyUp(key_);
};
};
class KeyDownCommand : public ICommand
{
DWORD key_; //not suare about win api here
public:
KeyDownCommand(key) : key_(key) {};
virtual void execute() const
{
keyDown(key_);
};
};
int main()
{
std::map<std::string, ICommand *> commands;
commands["t-"]=new KeyUpCommand(VK_TAB);
//execute now
std::map<std::string, ICommand *>::const_iterator iter = commands.find(_specialKey);
iter->second->execute();
};
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 嵌套for循环C++的问题(初学者)
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 用C#中的并集模拟C++嵌套结构
- 部分专业化和嵌套模板
- 嵌套While循环不起作用(C++问题)
- C++-模板嵌套类的引用初始化无效
- 如何在嵌套类中正确使用友元声明?
- UE4 C++ 我无法将 JSON 嵌套值获取到 TArray