-1

我正在尝试创建一个在初始化时接受函数作为参数的类。理想情况下,该功能应该已经存在。我知道在 Python 中,我可以这样做:

class TestClass:
    def __init__(self, function_parameter):
        self.fp = function_parameter
    def executeFP(self):
        self.fp()

def testFunction():
    print("test")

q = TestClass(testFunction)

q.executeFP()

我怎样才能在 C++ 中做到这一点?(如果重要的话,我正在使用 Arduino)

4

2 回答 2

1

Arduino 没有std::function,因为 AVR GCC 不附带标准库,因此评论中的这些建议不适用于该特定平台。

如果您需要 Arduino 或其他嵌入式平台的类似行为,您可以使用ETLetl::functionetl::delegate或创建您自己的实现。std::function使用堆分配进行类型擦除,这通常不是嵌入式的好选择。

最简单的实现将使用 C 风格的函数指针:

// Generic definition of the function type
template <typename F>
class function;

// R: return type
// Args: Any arguments a function can take
template <typename R, typename... Args>
class function<R(Args...)> {
 public:
  // Type definition of the equivalent C function pointer
  using function_type = R (*)(Args...);

  // Default constructor: empty function. 
  // Never call the function while not initialized if using it this way.
  function() = default;

  // Constructor: store the function pointer
  function(function_type f) : function_ptr(f){};

  // Call operator: calls the function object like a normal function
  // PS: This version does not do perfect forwarding.
  R operator()(Args... args) { return function_ptr(args...); }

 private:
  function_type function_ptr;
};

// A helper function can be used to infer types!
template <typename R, typename... Args>
function<R(Args...)> make_function(R (*f)(Args...)) {
  return {f};
}

活生生的例子,有一些用例。

当然,这种情况下也可以只使用 C 指针,但是这个类可以扩展为其他类型。如果您需要更复杂的行为,例如仿函数、成员函数和捕获 lambda,请参阅我上面引用的 ETL 实现。

于 2019-08-19T04:41:18.140 回答
0

您可以执行以下操作:(不确定Arduino是否可以具有以下功能

template <typename F>
class TestClass {
    public:
    TestClass( F func )
        :m_func(func)
    {

    }

    void executeFP()
    {
        m_func();
    }

    private:
    F *m_func;

};

void doStuff()
{

    std::cout << "test" << std::endl;
}

bool doAnotherStuff( )
{
    std::cout <<"test " << 40 +2 << std::endl;

    return true;

}

int main()
{
    TestClass<decltype(doStuff)> someObj ( doStuff );

    TestClass<decltype(doAnotherStuff)> someObj2 ( doAnotherStuff );

    someObj.executeFP();

    someObj2.executeFP();

}

这里

于 2019-08-19T03:58:59.500 回答