我正在通过其C++ SDK为应用程序编写插件.机制相当简单.插件通过预定义的接口提供其功能.这是通过让每个接口从一个实现类继承服务器类来完成的,该接口包含纯虚函数或具有默认实现的非纯函数.
这非常实用,因为SDK客户端只需要覆盖插件所需的那些方法和/或为没有默认值的(稀有)方法提供实现.
一直困扰着我的是,编译时都知道一切.与运行时多态性相关联的虚函数表和机制仅用于提供默认实现.
我试图在保持方便的同时消除这种开销.
作为一个(非常人为的)示例,假设我有几个服务器呈现单个接口(名为Blah),其中只包含一个没有默认实现的方法.
// SDK header
struct OldImpl_Blah {
virtual ~OldImpl_Blah() =default;
virtual int mult(int) =0;
};
// plugin source
class OldServer3 : public OldImpl_Blah {
public:
int mult(int i) override { return 3 * i; }
};
class OldServer5 : public OldImpl_Blah {
public:
int mult(int i) override { return 5 * i; }
};
Run Code Online (Sandbox Code Playgroud)
对于纯虚函数,直接CRTP工作得很好.
// SDK header
template <typename T>
struct NewImpl_Blah {
int mult(int i) { return static_cast<T*>(this)->mult(i); }
};
// plugin source …Run Code Online (Sandbox Code Playgroud) 我刚刚用msvc碰到了这个小错误.它看起来像是一个解析问题,但我不确定.
以下给出了C2143语法错误:缺少';' 之前'}'
#include <vector>
struct X { };
X f(const std::vector<int> v)
{
for (auto i : v)
if (true)
return X{}; // <--
return X{};
}
int main()
{
const auto x = f(std::vector<int>{});
}
Run Code Online (Sandbox Code Playgroud)
接下来的4个版本编译得很好.
这个
X f(const std::vector<int> v)
{
for (auto i : v)
if (true)
return X(); // <--
return X{};
}
Run Code Online (Sandbox Code Playgroud)
还有这个
X f(const std::vector<int> v)
{
for (auto i : v)
if (true) { // <--
return X{}; // <--
} …Run Code Online (Sandbox Code Playgroud)