在 C 中将函数作为参数传递

新手上路,请多包涵

我对 C++ 有点生疏,在使用了一年的 python 之后我正在切换。自然,我想将来自 python 的懒惰翻译成 C++。

我刚刚发现了 rot13,我对此感到非常兴奋。我找到了 3 种方法,我想做一些性能测试。我还想看看在原地修改字符串或创建新字符串是否有区别。所以我最终有6个功能。

在第一种方法中,我使用 std::map 来映射字符,因此我构建了一个初始化映射的类,在第二种方法中我使用三元运算符,第三种我使用位移。

现在函数原型看起来像这样

// map dependent
void Rot13::convert_inplace(string& mystr){

string Rot13::convert(const string& mystr){

// ternary operator
void bitrot_inplace(string& mystr){

string bitrot(const string&  mystr){

// bit shift
void bitshiftrot_inplace(string& mystr){

string bitshiftrot(const string& mystr){

我想构建一个接受这些函数作为参数的函数,然后计算时间并打印结果

所以我看了一下 stackoverflow, 1 , 2 ,我想出了这个

typedef void (*vfc)(string str);

void printtime_inplace(string title, vfc func){

我尝试了这种结构,但这意味着我受到 vfc 返回类型的限制,在我的情况下是 voidstring ,事实上我需要传递类的指针。因此,我将不得不做 3 个函数来适应不同的函数,即一个用于类成员函数的函数、一个用于 void 返回类型的函数和一个用于字符串返回类型的函数。

于是我问自己,这样的情况是不是真的需要用模板不写3次相同的功能?我真的对模板没有信心,但我应该做 3 typedefs 并构造 printtime 函数来接受模板吗?此外,有没有办法告诉模板您将只接受这些类型(即我定义的那个)?

另一个问题,这是一个好的设计吗?或者你会建议其他设计吗?另一个实现?

原文由 Pella86 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 352
1 个回答

IMO 最简单的方法是使用模板,而不是尝试编写具有具体类型的函数。

 template<typename Function>
void printtime_inplace(string title, Function func)
{
    //...
    func(title);
    //...
}

现在,这将允许您采用任何“功能”。您可以向它传递一个常规函数、一个仿函数、一个 lambda、一个 std::function ,基本上,任何可调用的。编译器将为您消除不同的实例化,但就您的代码而言,您正在调用相同的函数。

原文由 NathanOliver 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题