CRTP:具有基于派生参数的函数
CRTP: function with derived-based argument
下面是我尝试做的一个最低版本:
template<typename D>
struct Base {
void common() {
// ... do something ...
static_cast<D *>(this)->impl();
// ... do something ...
}
void common_with_arg(typename D::Arg arg) {
// ... do something ...
static_cast<D *>(this)->impl_with_arg(arg);
// ... do something more ...
}
};
struct Derived : Base<Derived> {
void impl() { }
using Arg = int;
void impl_with_arg(Arg arg) { }
};
CCD_ 1和CCD_ 2工作正常(如预期)。而Base::common_with_arg()
和Derived::impl_with_arg()
则不然。
例如,使用gcc,我会得到以下错误:
1.cc: In instantiation of ‘struct Base<Derived>’:
1.cc:18:18: required from here
1.cc:11:7: error: invalid use of incomplete type ‘struct Derived’
void common_with_arg(typename D::Arg arg) {
^~~~~~~~~~~~~~~
1.cc:18:8: note: forward declaration of ‘struct Derived’
struct Derived : Base<Derived> {
直观地(在不了解模板实例化的所有细节的情况下),这似乎是一个合理的错误。是否有其他方法可以实现相同的功能?
void common_with_arg(typename D::Arg arg)
// ^^^^^^
您不能在此处访问D::Arg
,因为需要Derived
的定义。但是该定义永远不可用,因为Base
模板正在这里实例化。。。
struct Derived : Base<Derived> {
// ^^^^^^^^^^^^^
其中CCD_ 8尚未完全定义。
一种可能的解决方法是将common_with_arg
作为函数模板:
template <typename T>
void common_with_arg(T&& arg) {
// ... do something ...
static_cast<D *>(this)->impl_with_arg(std::forward<T>(arg));
// ... do something more ...
}
wandbox上的示例
如果您确实需要Base::common()
0类型别名,请阅读以下问题:
"C++静态多态性(CRTP)和使用派生类的typedefs">。
相关文章:
- 在派生函数中指定void*参数
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 创建派生自可变参数模板包的类型元组
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- C++派生类重载函数(带有 std::function 参数)不可见
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 从模板参数派生的类
- C++ 如何使派生类自动获取基类参数
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 如何在派生类中正确覆盖具有不同参数的函数?
- 根据参数创建派生类的新实例
- 具有派生参数的函数重写
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 将方法参数类型更改为子类中的派生类
- CRTP:具有基于派生参数的函数
- c++中派生参数化因子的设置值
- C++方法重载:基参数和派生参数