gpt4 book ai didi

c++ - 从成员函数指向函数的指针

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:50 24 4
gpt4 key购买 nike

我的情况有点复杂。它可能可以很容易地通过继承来解决,但我现在很好奇并且由于其他一些原因我会用这种方式解决它。

我有一个代表算法的类,随着时间的推移,已经实现了一个不同的解决方案。目前,我有原来的类(class),它的成员是新类(class)。我会同时拥有算法和开关,以便能够根据情况使用它们。

#include "B.h"
class A {
public:
typedef void ( A::*FooFunction )( float, float );
A::FooFunction m_fooFunction;
B m_b;

A( WhichUseEnum algorithm ) : m_b( B() )
{
switch( algorithm ) {
case ALG_A:
m_fooFunction = &A::FooFunctionOfA;
break;
case ALG_B:
m_fooFunction = ??? // something like: m_b.FooFunctionOfA
break;
}
}

void FooFunction( float a , float b)
{
( this->*m_fooFunction )( a, b );
}

void FooFunctionOfA( float, float ); // implementation at the .cpp
};

class B {
public:
void FooFunctionOfB( float, float );
}

如您所见,我想保存指向成员 m_b 的函数的指针,并像 FooFunction 那样调用它。有了自己的功能( FooFunctionOfA() )我已经成功了,但另一个更难。我尝试了几个想法,但找不到编译器接受的版本。 :)

我发现了一个类似的问题,解决方案如下所示:&m_b.*m_b.FooFunctionOfB,此时我放弃了。

如果有人有任何想法,请不要犹豫与我分享。

我使用的是 C++ 但不是 C++0x,我被迫避免使用 STL 和 boost。

最佳答案

您需要使用std::tr1::function。此类是为您需要的目的而构建的。它可以接受任何函数、成员函数等。

class A {
public:
std::tr1::function<void(float, float)> m_fooFunction;
B m_b;

A( WhichUseEnum algorithm ) : m_b( B() )
{
switch( algorithm ) {
case ALG_A:
m_fooFunction = std::tr1::bind(&A::FooFunctionOfA, this);
break;
case ALG_B:
m_fooFunction = std::tr1::bind(&A::FooFunctionOfA, &m_b);
break;
}
}

void FooFunction( float a , float b)
{
m_fooFunction( a, b );
}

void FooFunctionOfA( float, float ); // implementation at the .cpp
};

class B {
public:
void FooFunctionOfB( float, float );
}

这里我使用了 std::tr1::bind 来定义这两个函数。如您所见,调用语法也更简单 - 就像常规函数调用一样。 std::tr1::bind 可以绑定(bind)的不仅仅是成员函数和成员函数指针。啊,我已经有一段时间没有使用 bind 而不是 lambda 了。

C++ 的一般规则是,如果您正在使用函数指针或成员函数指针并且您没有与某些旧代码进行交互,那么您几乎可以肯定做错了。这也不异常(exception)。如果您是 C++0x 之前的版本,那么您可能还需要绑定(bind)它们,仅此而已。

如果您使用的编译器太老了,它甚至没有 TR1,您可以使用 Boost 来替代这些工具 - 它们是从 Boost 标准化的,因此 Boost 等效项非常接近功能和界面。

关于c++ - 从成员函数指向函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23299720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com