Переопределить функцию, но сохранить ссылку на оригинал - PullRequest
0 голосов
/ 27 февраля 2020

Я неопытен в 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?
}
}

1 Ответ

0 голосов
/ 27 февраля 2020

По сути, хорошей практикой является выделение сторонней зависимости с использованием абстрактной информации. Цель состоит в том, чтобы скрыть библиотечный API за некоторым интерфейсом, реализация которого может быть свободно изменена.

Я делаю это более или менее так:

// 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;
};

Для случаев, когда важна производительность, я используя stati c полиморфизм (программирование шаблонов).

...