小编Gar*_*arp的帖子

用CRTP替换非纯虚函数

我正在通过其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)

c++ virtual inheritance crtp

5
推荐指数
1
解决办法
486
查看次数

奇怪的编译器错误

我刚刚用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)

c++ compiler-errors parsing-error

5
推荐指数
1
解决办法
316
查看次数