c++ - 没有或最小开销的函数组合宏

标签 c++ functional-programming macros metaprogramming c++17

假设我们有如下函数:

void blax(T t) {
    for {...
            //Stuff
                auto variable = generator(previous_internal_value); 
            //Stuff
    }
}

在这个函数的深处还有另一个叫做“生成器”的函数。可以很容易地修改函数“blax”以实现另一个角色,让我们称这个函数为“blax2”。

两者在实现上的唯一区别是'balx2'使用函数generator2:

void blax2(T t) {
    for {...
            //Stuff
                auto variable = generator2(previous_internal_value); 
            //Stuff
    }
}

我想要一种通用的方式来编写这两个函数。我想出的是这样的:

    void generic_blax(T t, std::function<int(int)> generator_impl) {
            for {...
                    //Stuff
                        auto variable = generator_impl(previous_internal_value); 
                    //Stuff
            }
        }


void blax(T t) {
    return generic_blax(t, generator)
}

void blax2(T t) {
    return generic_blax(t, generator2)
}

此实现非常好,但我不确定上述代码的效率。所以我的问题有三个方面:

有没有办法通过宏来完成这个函数“注入(inject)”,这样我就不必在运行时对函数的 nr 和函数调用的 nr 进行惩罚?

如果不是,使用 std::function 而不是函数指针是否会导致性能损失?

并且,尝试使用 inline 关键字强制内联 'generic_blax' 以获得更接近于 blax 和 blax2 具有其“正常”函数体的性能的性能是否明智?或者如果它太大(即使这只需要在两个地方发生),将内联放在 'blax_generic' 之前不会内联函数?

最佳答案

而不是使用 std::function<...> ,考虑一个模板。宏被认为是有害的,因为它们的行为与函数调用略有不同,但看起来是一样的。

template <class Generator>
void generic_blax(T t, Generator generator_impl) {
    for {...
        //Stuff
        auto variable = generator_impl(previous_internal_value); 
        //Stuff
        }
    }

您甚至不必更改调用站点

void blax(T t) {
    return generic_blax(t, generator)
}

void blax2(T t) {
    return generic_blax(t, generator2)
}

注意关键字 inline 不再内联有任何关系,而且它从不强制它。链接时优化可以包括跨 TU 的内联

关于c++ - 没有或最小开销的函数组合宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44842846/

相关文章:

c++ - MongoDB C++:mongocxx::pool 线程安全吗?

macros - 如何将Rust宏变量嵌入文档中?

c++ - vector<double> f(long int N) 的问题

c++ - 使用一个单独的 DLL 库在运行时导入其他库

javascript - JavaScript 和 ES6 中柯里化(Currying)函数的函数应用

functional-programming - 使用 Ada 子类型等函数语言定义自然数

javascript - 使用 "map"函数返回多个数组

macros - 如何使用 `clojure.tools.macro/name-with-attributes` ?

c - 如何在宏中使用##?

c++ - 来自 std::get 的完美转发元组值