首页 > 解决方案 > 如何添加依赖于类本身的模板成员变量

问题描述

我有一个模板类,需要传递一个可调用对象来处理错误。可调用对象必须重载void operator()(const boost::system::error_code&),并且它的类型作为模板参数传递以使类更通用(例如接受 lambdas)。

这个类看起来像这样

template <typename AsyncStream,
          typename ErrorHandler,
          typename = std::enable_if_t<...>>
struct basic_api {
  ...
  private:
    AsyncStream sock_;
    ErrorHandler error_handler_;
};

现在,我想在另一个重载的类中创建这个类的一个实例void operator()(const boost::system::error_code&)

测试夹具示例:

struct BasicApiTest : ::testing::Test {
    void operator()(const boost::system::error_code& err) {
        // handler errors
    }

    std::shared_ptr<basic_api<tikpp::tests::fakes::socket, ???>> api;
};

我试图通过创建一个具有错误处理函数重载的附加类来解决这个问题,然后从它派生,如下所示:

struct error_handler {
    void operator()(const boost::system::error_code& err)
        // handle errors
    }
};

struct BasicApiTest : error_handler, ::testing::Test {
    using socket_type  = tikpp::tests::fakes::socket;
    using handler_type = error_handler;
    using api_type     = tikpp::basic_api<socket_type, handler_type>;

    BasicApiTest() : api{...} {}

    std::shared_ptr<api_type> api;
};

但是这个解决方案有很多限制。

这在 C++ 中是否可行,或者我应该找到另一种方法来传递错误处理程序?

标签: c++templates

解决方案


首先,您的要求很难理解。这听起来像是所谓的 XY 问题。请参阅此处的说明。

问题可能不是,如何使用模板或特殊语法。真正的问题可能不同。我认为,您希望通过类层次结构轻松实现某些目标。在基类中使用纯虚函数,在派生类中使用覆盖函数。

但是您在某处提到您认为开销太大。

因此,我假设您的问题是关于Static Polymorphism。这通常通过 CRTP“Curiously Recurring Template Pattern”解决。因为你有一个模板基类和一个派生类,它派生自 Base。

请从这里开始阅读。

我希望我理解你的问题。如果没有,请发表评论,我将删除答案。


推荐阅读