在 C++ 中将带或不带参数的函数作为参数传递
Pass function with or without argument as argument in C++
我想将不带参数的 void 函数或带参数的 void 函数作为参数传递给构造函数。像这样:
DailyActivity activity1(&function1)
或
DailyActivity activity2(&function2(uint_t 1))
传递的函数应该在调用DailyActivity::run()
时触发。
DailyActivity
的 header 看起来像这样:
class DailyActivity {
typedef void (*function_type)();
public:
DailyActivity(void (*f)());
virtual void run();
private:
function_type m_function;
};
构造函数和 运行() 函数如下所示:
DailyActivity::DailyActivity(void (*f)()) : m_function((*f)) {
}
DailyActivity::run() {
m_function();
}
但我无法 (1) 以正确的方式定义 typedef 以允许接受两个不同的函数和 (2) 成功传递参数 o function2。
你不能那样做。不幸的是,C++ 不能处理部分函数,所以你必须重载你的构造函数,将函数和参数作为两个单独的参数,第二个参数处理无参数参数。那么你将有两个函数指针,其中一个应该为空。
另一种选择是将函数包装到 lambda 中。
您可以将 std::function
与 lambda
或 std::bind
一起使用:
class DailyActivity {
public:
explicit DailyActivity(std::function<void ()> f) : m_function(f) {}
void run() { m_function(); }
private:
std::function<void ()> m_function;
};
并称之为
DailyActivity activity1(&function1);
DailyActivity activity2([](){function2(1);});
我想将不带参数的 void 函数或带参数的 void 函数作为参数传递给构造函数。像这样:
DailyActivity activity1(&function1)
或
DailyActivity activity2(&function2(uint_t 1))
传递的函数应该在调用DailyActivity::run()
时触发。
DailyActivity
的 header 看起来像这样:
class DailyActivity {
typedef void (*function_type)();
public:
DailyActivity(void (*f)());
virtual void run();
private:
function_type m_function;
};
构造函数和 运行() 函数如下所示:
DailyActivity::DailyActivity(void (*f)()) : m_function((*f)) {
}
DailyActivity::run() {
m_function();
}
但我无法 (1) 以正确的方式定义 typedef 以允许接受两个不同的函数和 (2) 成功传递参数 o function2。
你不能那样做。不幸的是,C++ 不能处理部分函数,所以你必须重载你的构造函数,将函数和参数作为两个单独的参数,第二个参数处理无参数参数。那么你将有两个函数指针,其中一个应该为空。
另一种选择是将函数包装到 lambda 中。
您可以将 std::function
与 lambda
或 std::bind
一起使用:
class DailyActivity {
public:
explicit DailyActivity(std::function<void ()> f) : m_function(f) {}
void run() { m_function(); }
private:
std::function<void ()> m_function;
};
并称之为
DailyActivity activity1(&function1);
DailyActivity activity2([](){function2(1);});