初始化期间的运行时类方法替换
Posted
技术标签:
【中文标题】初始化期间的运行时类方法替换【英文标题】:Runtime class method replacement during initialisation 【发布时间】:2017-11-08 22:36:08 【问题描述】:假设我有一个类,其中包含一个方法speak()
,它将向终端打印一些东西。它究竟会打印什么由初始化布尔值决定,如果为真,它将打印“Foo”,如果为假,它将打印“Bar”。布尔值的值是在运行时确定的。
实现这一点的一种方法是在speak()
函数中添加if
语句,然后调用foo()
或bar()
方法。但是,如果频繁调用此类方法,则可以通过在类初始化时将speak()
函数替换为foo()
或bar()
函数来避免if
开关和附加函数调用。有没有办法使用,也许使用功能点来实现这个功能?
class MyClass
public:
MyClass (const bool select)
if (select)
// Make speak() use foo();
else
// Make speak() use bar();
speak() const;
private:
foo() const std::cout << "Foo\n";
bar() const std::cout << "Bar\n";
似乎这种行为是有益的,因此我认为有某种方法可以实现它。但是,我没有找到如何做到这一点的运气,主要是因为我不确定要谷歌搜索什么。
感谢您的帮助和建议。
【问题讨论】:
我认为这个问题***.com/questions/2898316/… 是关于一个类似的想法。也许答案会为您指明正确的方向。 【参考方案1】:似乎这种行为是有益的,因此我认为有某种方法可以实现它。
是的,可以使用成员函数指针。
声明一个成员变量,它是一个成员函数指针。
void (MyClass::*speaker)() const;
在构造函数中适当地初始化它。
MyClass (const bool select)
if (select)
speaker = &MyClass::foo;
else
speaker = &MyClass::bar;
在speak
中使用它。
void speak() const
(this->*speaker)();
在http://en.cppreference.com/w/cpp/language/pointer 上阅读有关成员函数指针的更多信息。
这里是a working example:
#include <iostream>
class MyClass
public:
MyClass (const bool select)
if (select)
speaker = &MyClass::foo;
else
speaker = &MyClass::bar;
void speak() const
(this->*speaker)();
void (MyClass::*speaker)() const;
private:
void foo() const std::cout << "Foo\n";
void bar() const std::cout << "Bar\n";
;
int main()
MyClass m1(true);
MyClass m2(false);
m1.speak();
m2.speak();
及其输出:
Foo
Bar
【讨论】:
谢谢,这正是我想要的行为。【参考方案2】:将传递给构造函数的值存储起来并在speak()中的条件中使用它不只是一个问题吗?
class MyClass
private:
bool mselect;
public:
MyClass (const bool select)
mselect = select;
void speak()
if(mselect)
std::cout << "Foo\n";
else
std::cout << "Bar\n";
;
或者我错过了这个问题的一部分?抱歉,将作为评论发布,但还没有声誉。
【讨论】:
这个例子只是对实际问题的抽象。foo()
和 bar()
类在现实中做的事情要复杂得多。虽然您的建议肯定会奏效,但它可能不是最有效的方法,因为它需要在每次调用speak()
时检查mselect
的值,然后可能会调用另一个方法。目的是用所需的方法有效地替换 speak()
方法。以上是关于初始化期间的运行时类方法替换的主要内容,如果未能解决你的问题,请参考以下文章