【发布时间】:2019-02-26 15:43:40
【问题描述】:
给定一个函数签名(例如来自 template 参数),我想使用该签名创建一个(非内联)函数,然后调用它。
以下内容应阐明此意图。正如所写,它是无效的,因为标记的行实际上生成了一个空函数指针,而不是一个空函数:
template <typename Function, typename... Args>
void foo(Args... args) {
Function fn_trivial = {}; //incorrect; should be empty function, not null function
fn_trivial(args...);
}
如何在这里创建函数对象?
(旁注:这似乎是一件奇怪的事情。原因是它是一个通用分析器,它调用(标记为不可内联)测试函数n 次来计算平均延迟. 测试代码成本的(更好)相似性可以通过减去具有相同参数的函数调用的延迟来获得,平均而言,它什么都不做。)
【问题讨论】:
-
Function很可能是一个 f 指针,在这种情况下,初始化会将其设置为nullptr。 “空”函数应该做什么? -
关于你的旁注:如果函数什么都不做,那么它的调用是一个很好的优化对象
-
@SombreroChicken OP 很可能意味着 NOP。
-
将其设为本地 lambda 并调用它。
-
普通函数是否应该返回
void?无论如何,您的用例可能超出了 C++ 标准的编写目的(因为您正在积极地与编译器抗争以不优化调用)。也许您应该弄清楚所需的程序集是什么样子并从那里开始工作。