gpt4 book ai didi

c++ - 指向模板接口(interface)的唯一指针

转载 作者:行者123 更新时间:2023-11-30 05:01:04 25 4
gpt4 key购买 nike

为了简单起见,我将我的问题简化为简单的示例。我有基类:

template<typename T>
class Base {
virtual T getParameter(T&) = 0;
};

和使用工厂方法返回其对象的派生类:

template<typename T>
class Der : public Base<T> {
public:
static std::unique_ptr<Der> getInstance() {
return std::make_unique<Der<std::string>>();
}
T getParameter(T& param) override {
return param;
}
};

现在我想使用包含接口(interface)的 unique_ptr 传递派生类的对象,即:

template<typename T>
void someFun(std::unique_ptr<Base<T>>&& ptr) {
//do sth with ptr
}

通过调用:

someFun(Der<std::string>::getInstance());

错误:

test.cpp:26:44: error: no matching function for call to ‘someFun(std::unique_ptr<Der<std::__cxx11::basic_string<char> >, std::default_delete<Der<std::__cxx11::basic_string<char> > > >)’
someFun(Der<std::string>::getInstance());
^
test.cpp:21:6: note: candidate: template<class T> void someFun(std::unique_ptr<Base<T> >&&)
void someFun(std::unique_ptr<Base<T>>&& ptr) {
^~~~~~~
test.cpp:21:6: note: template argument deduction/substitution failed:
test.cpp:26:44: note: mismatched types ‘Base<T>’ and ‘Der<std::__cxx11::basic_string<char> >’
someFun(Der<std::string>::getInstance());

最佳答案

我认为解决这个问题的最简单方法是创建一个别名 TBase ,派生类型上的模板,并使用它而不是依赖模板推导。

您仍然可以强制继承自 Base通过使用 std::is_base_of<>如果你害怕不小心输入不相关的东西。

#include <memory>
#include <typer_traits>

template<typename T>
class Base {
public:
using param_t = T;
virtual T getParameter(T&) = 0;
};

template<typename T>
class Der : public Base<T> {
public:
static std::unique_ptr<Der> getInstance() {
return std::make_unique<Der<std::string>>();
}
T getParameter(T& param) override {
return param;
}
};

template<typename DerivT>
void someFun(std::unique_ptr<DerivT> deriv_ptr) {
using T = typename DerivT::param_t;
// Just to be safe
static_assert(std::is_base_of<Base<T>, DerivT>::value, "");

// If you REALLY care about only having a base pointer:
std::unique_ptr<Base<T>> ptr(deriv_ptr.release());

//do stuff.
}

void foo() {
someFun(Der<std::string>::getInstance());
}

你也可以用 enable_if 来耍花招如果你真的想处理 someFun() 的不同重载.但是,我找到了 static_assert()方式更清洁,所以除非必要,否则我会使用它。

关于c++ - 指向模板接口(interface)的唯一指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50451974/

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