指向实例成员函数的指针而不是 class
Pointer to member function of instance instead of class
当我根据某些条件获得指向成员函数的指针然后调用该函数时,我有以下class。
class Test
{
public:
bool isChar(char ch) { return (ch >= 'a' && ch <= 'z'); }
bool isNumeric(char ch) { return (ch >= '0' && ch <= '0'); }
enum class TestType
{
Undefined,
Char,
Numeric,
AnotherOne,
};
bool TestFor(TestType type, char ch)
{
typedef bool (Test::*fptr)(char);
fptr f = nullptr;
switch(type)
{
case TestType::Char:
f = &Test::isChar;
break;
case TestType::Numeric:
f = &Test::isNumeric;
break;
default: break;
}
if(f != nullptr)
{
return (this->*f)(ch);
}
return false;
}
};
但实际上我不喜欢这种语法。有没有办法替换
(this->*f)(ch)
和
f(ch)
?
在我的真实代码中,这个函数足够大,但不太清楚 (this->*f)
是什么。我正在寻找一些 c++11
解决方案。我知道 std::function
,如果找不到解决方案,我会使用它。
更新
我决定使用的解决方案,如果突然有人需要它:(感谢@StoryTeller - Unslander Monica)
bool TestFor(TestType type, char ch)
{
bool(Test::* fptr)(char) = nullptr;
switch(type)
{
case TestType::Char:
fptr = &Test::isChar;
break;
case TestType::Numeric:
fptr = &Test::isNumeric;
break;
default: break;
}
if(fptr != nullptr)
{
auto caller = std::mem_fn(fptr);
return caller(this, ch);
}
return false;
}
如果语法让您如此困扰,您始终可以使用 std::mem_fn
生成一个廉价的一次性包装器来围绕成员函数。
auto caller = std::mem_fn(f);
caller(this, ch);
当我根据某些条件获得指向成员函数的指针然后调用该函数时,我有以下class。
class Test
{
public:
bool isChar(char ch) { return (ch >= 'a' && ch <= 'z'); }
bool isNumeric(char ch) { return (ch >= '0' && ch <= '0'); }
enum class TestType
{
Undefined,
Char,
Numeric,
AnotherOne,
};
bool TestFor(TestType type, char ch)
{
typedef bool (Test::*fptr)(char);
fptr f = nullptr;
switch(type)
{
case TestType::Char:
f = &Test::isChar;
break;
case TestType::Numeric:
f = &Test::isNumeric;
break;
default: break;
}
if(f != nullptr)
{
return (this->*f)(ch);
}
return false;
}
};
但实际上我不喜欢这种语法。有没有办法替换
(this->*f)(ch)
和
f(ch)
?
在我的真实代码中,这个函数足够大,但不太清楚 (this->*f)
是什么。我正在寻找一些 c++11
解决方案。我知道 std::function
,如果找不到解决方案,我会使用它。
更新
我决定使用的解决方案,如果突然有人需要它:(感谢@StoryTeller - Unslander Monica)
bool TestFor(TestType type, char ch)
{
bool(Test::* fptr)(char) = nullptr;
switch(type)
{
case TestType::Char:
fptr = &Test::isChar;
break;
case TestType::Numeric:
fptr = &Test::isNumeric;
break;
default: break;
}
if(fptr != nullptr)
{
auto caller = std::mem_fn(fptr);
return caller(this, ch);
}
return false;
}
如果语法让您如此困扰,您始终可以使用 std::mem_fn
生成一个廉价的一次性包装器来围绕成员函数。
auto caller = std::mem_fn(f);
caller(this, ch);