gpt4 book ai didi

c++ - 覆盖函数但保留对原始函数的引用

转载 作者:行者123 更新时间:2023-12-04 17:05:56 25 4
gpt4 key购买 nike

我对 C++ 缺乏经验,所以我可能会遗漏正确的搜索词。

我想在运行时用我自己的包装器替换一些库函数。基本上,我想提供该库的检测版本。在理想的世界中,库的用户不必更改他们的代码来使用这个版本(或者,最多只更改 CMakeLists.txt 中的链接)。

用户定义的可执行文件通常在 CMake 文件中声明如下。

add_library(my_code ${SOURCES})
add_dependencies(my_code ${catkin_EXPORTED_TARGETS})
target_link_libraries(my_code ${catkin_LIBRARIES})

我想,为了实现这一点,改变 target_link_libraries()将是必需的,以便链接到不同的版本。

但是,即使我重新定义了原始头文件中的所有函数,在相同的命名空间下,如何引用原始实现?

namespace thelib {
void theFunction() {
// how do I call the original thelib::theFunction() here?
}
}

最佳答案

基本上,使用抽象来隔离第三方依赖是一种很好的做法。目的是将库 API 隐藏在某个接口(interface)后面,该接口(interface)的实现可以自由更改。

我或多或少是这样做的:

// some header
class IDependency {
public:
virtual ~IDependency() = default;

virtual void theFunction() = 0;
};

std::unique_ptr<IDependency> depFactory(int someArg);

// some cpp
std::unique_ptr<IDependency> depFactory(int someArg)
{
if (someArg = 0) {
return std::make_unique<LibraryWrapper>();
}
if (someArg = 0) {
auto origLib = std::make_unique<LibraryWrapper>();
return std::make_unique<DepCutomization>(origLib);
}
throw std::invalid_argument("");
}

// LibraryWrapper
class LibraryWrapper : public IDependency {
public:
void theFunction() override {
::thelib::theFunction();
}
}

// DepCutomization
class DepCutomization : public IDependency {
public:
explicit DepCutomization(std::unique_ptr<IDependency> orig)
: m_orig(std::move(orig))
{}

void theFunction() override {
customAction();
m_orig->theFunction();
}

void customAction()
{}

private:
std::unique_ptr<IDependency> m_orig;
};

对于性能很重要的情况,我使用静态多态(模板编程)。

关于c++ - 覆盖函数但保留对原始函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60431712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com