【发布时间】:2019-02-05 06:07:12
【问题描述】:
我有一对类 FS 和 DS,它们都派生自另一个类 S。我有一个函数,我传入一个 S*(即 FS 或 DS),它进一步调用另一个传入同一个 S 的函数*。在这个最终函数中,我需要根据 S 是 FS 还是 DS 有不同的行为,但由于它位于关键路径上,我更愿意在编译时解析这个分支。我怎样才能做到这一点?我觉得涉及元编程和/或 constexpr 的东西 - 我不想每次都进行虚拟调用
为简洁起见省略了无关的细节
class S {};
class FS : public S {};
class DS : public S {};
void func_2(Space *s) {
// common code
// branch based on lowest type of s
// common code
}
void func_1(Space *s) {
// common code
func_2(s);
}
【问题讨论】:
-
如果您不知道函数将使用哪个具体实例(FS 或 DS)被调用,那么无论有没有模板,您都无法实现这种类型的编译时多态性。您要么必须切换它,要么确实使用虚拟呼叫。
-
有关此类模板元编程的总结答案请参见此处:stackoverflow.com/a/1881730/2754173
-
这个问题很不清楚。这条关键路径是否不止一次运行?像循环一样?那么“通过”是指循环还是什么?它是否在同一对象或对象类型上重复运行? minimal reproducible example 是必需的,它既最小并且显示问题。
-
@Yakk-AdamNevraumont 考虑到 5 个不同的用户在您发帖前 7 小时都回答了或多或少相同的答案,显然不清楚或在这种情况下需要 MVP
-
@Madden 我能想到十几个与提出的不同的答案。他们为您的问题可能涉及的一个可能问题提供了一种可能的答案。是关于它吗?可能是。问题不清楚。不清楚的问题得到答案,并不意味着它们就是真正问题的答案。
标签: c++ polymorphism c++17 template-meta-programming