c++ - 从非模板类调用专门的模板方法
问题描述
我无法在非模板类的专用模板类中调用方法。
我有一个如下模板类:
template<class T>
class Builder{
Builder() { t = new T; }
Builder &setName(const int &name);
// other methods
T &build();
protected:
T *t;
}
template<class T>
T &Builder<T>::build() {
return *t;
}
// other implementations
我有一个从专门的模板类继承的类
class SomeClass;
//template<class T>
class SomeClassBuilder : public Builder<SomeClass> {
public:
SomeClassBuilder() : Builder<SomeClass>() {}
SomeClassBuilder &setAge(int age);
}
class SomeClass{
public:
static SomeClassBuilder createExperiment(){
return {};
}
// other methods
}
但是,当我尝试根据链接方法调用的方式使用此 SomeClassBuilder 时,有时会出现错误。下面的代码片段给出了一个错误(has no member named setAge
)。
SomeClass::Engine()
.setName("Name")
.setAge(109)
.build();
像下面这样链接方法调用不会出错,因为类的setAge
方法SomeClass
在模板类之前。
SomeClass::Engine()
.setAge(109)
.setName("Name")
.build();
解决方案
您的问题是引用SomeClassBuilder &
可以解释为Builder<SomeClass> &
但不能反过来(因为您需要动态转换)。由于Builder<T>
return a Builder<T> &
this 的方法确实没有set_age
成员。这对于模板没有问题,但对于继承。
我看到了 3 个解决方案:
- 总是
set_age
先使用,而函数应用的类型仍然是SomeClassBuilder &
. - 覆盖所有函数,
SomeClassBuilder
使它们执行基类中的方法,然后*this
以SomeClassBuilder &
. - 使用CRTP,因此向基类添加一个模板参数,该参数
class Child
获取继承的 Child 的类型,并让所有方法返回Child &
,而不是返回之前Builder &
必须dynamic_cast
this
返回。然后SomeClassBuilder
应该继承自Builder<T, SomeClassBuilder>
(需要前向声明)。
另外:不要使用原始指针来拥有内存。代码中的原始new
代码不是一个好兆头。改为使用std::unique_ptr
。
推荐阅读
- html - 如何在 jQuery 中访问 div 内的元素?
- python - 顶层图表标记可以完全覆盖 Altair 中的下层图表标记吗?
- node.js - Nodejs mongodb驱动keepAlive选项有什么用?
- grafana - 通过 PROXY 或 DIRECT 访问数据源是否会对性能产生影响?
- spring - 乐观锁定 - 基于会话的锁定
- c# - 如何将强 html 元素转换为跨度元素 iText 7?
- python-3.x - Ipython 小部件下拉列表,包括 NaN 值
- html - 减少两个 div 之间的空间
- node.js - Chai-http 测试通过 Github 操作返回“错误:getaddrinfo EAI_AGAIN undefined”
- javascript - Mobx 可观察