小编Luk*_*uke的帖子

GitHub Actions - 缓存 CMake 构建

在每次提交时,我都会在不同的操作系统上构建我的项目。因此,我使用 CMake 作为我的 C++ 代码的构建系统。为了使构建速度更快,我尝试缓存较旧的构建,因此不必重新构建未更改的文件。我编写了以下 GH 动作脚本:

name: Build for MacOS, Ubuntu and Windows

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

env:
  BUILD_TYPE: Release

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-20.04, macos-11, windows-2022 ]
    steps:
      - uses: actions/checkout@v2

      - name: Cache build
        uses: actions/cache@v3
        with:
          path: ${{github.workspace}}/build
          key: ${{ matrix.os }}-build
          restore-keys: ${{ matrix.os }}-build

      - name: Configure CMake
        run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} -DFORCE_COLORED_OUTPUT=1

      - name: Build
        run: cmake …
Run Code Online (Sandbox Code Playgroud)

github-actions

7
推荐指数
0
解决办法
1122
查看次数

具有可变返回类型的 C++ 访问者模式

我有以下设置:

class IVisitor{
public:
    virtual SomeType visit(IVisitable& visitable) = 0;
};

class IVisitable{
public:
    virtual SomeType accept(IVisitor& visitor) = 0;
};

class ConcreteVisitor : public IVisitor{
public:
    SomeType visit(IVisitable& visitable) override {
        return calculateSomeStuff();
    }
};

class ConcertVisitable : public IVisitable{
public:
    SomeType accept(IVisitor& visitor) override {
        return visitor.visit(*this);
    }
};
Run Code Online (Sandbox Code Playgroud)

但我希望不同的访问者返回不同的类型。为此,IVisitable::accept()还应该返回不同的类型。

这将导致以下(不正确)代码:

template <typename R>
class IVisitor{
public:
    virtual R visit(IVisitable& visitable) = 0;
};

class IVisitable{
public:
    template <typename R>
    virtual R accept(IVisitor<R>& visitor) = 0; …
Run Code Online (Sandbox Code Playgroud)

c++ templates virtual-functions visitor-pattern

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