基于派生类型编译时间行为分支

Mad*_*den 0 c++ polymorphism template-meta-programming c++17

我有一对类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);
}
Run Code Online (Sandbox Code Playgroud)

pal*_*123 5

双方func_1func_2应模板,可能会进行一些SFINAE以确保呼叫类型从S.衍生然后你只需做if constexpr(std::is_same<std::decay_t<T>, FS>::value)和实施不同类别不同的行为.
如果将基类指针传递给方法,那么我相信在编译时无法检索派生类型.