在每次提交时,我都会在不同的操作系统上构建我的项目。因此,我使用 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) 我有以下设置:
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)