gpt4 book ai didi

c++ - 奇怪的重复出现的模板和模板参数相关的子类化问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:20 26 4
gpt4 key购买 nike

我正在尝试让下面的代码工作

template < class __derived, class __object = typename __derived::Object >
struct Base {
using Derived = __derived;
using Object = __object;
void function(Object o) { return Derived::function(s); }
}

//template < class __derived >
//struct Base {
// using Derived = __derived;
// using Object = typename Derived::Object;
// void function(Object o) { return Derived::function(s); }
//}

template < class __object >
struct Derived : public Base< Derived< __Object > > {
using Object = __object;
void function(Object o) { ... }
}

然后我通过声明实例化一个对象

Derived<double> obj;

问题是,编译器声称无法找到符号 ObjectDerived里面类,同时推导 Base 的第二个模板参数类(class)。注释版本也产生了同样的错误。

我正在尝试在 Eigen3 代码的启发下执行此操作,特别是他们使用的 CRTP(奇怪的重复模板模式)以避免使用虚函数。 Eigen3 实际上使用了一个 traits类,但我无法弄清楚如何在当前案例中模仿它。有人对此有什么建议吗?提前致谢!

最佳答案

通常,如果您希望 A 继承 B,那么 B 除了它的声明之外无法知道任何关于 A 的信息:

template < class __object >
struct Derived;

不幸的是,你想得到更多,所以你必须使用类型特征:

template<class __derived>
struct Base_traits {
//using Object = ?????;
};
template<class __object>
struct Base_traits<Derived<__object>> {
using Object = __object; //note, this also can't inspect B.
};

Base 类可以随心所欲地检查 Base_traits,因为这些特征根本不检查 B

template < class __derived, class __object = typename Base_traits<__derived>::Object >
struct Base {
using Derived = __derived;
using Object = typename Base_traits<__derived>::Object;
//or
using Object = __object;


凡人不允许使用不相关的前导双下划线,使用一个前导下划线后跟一个小写字母。或者,使用尾随下划线。

还有语法

void function(Object o) { return Derived::function(s); }

不会工作,因为该表示法不能用于向上转型,只能用于向下转型。因此,您必须在 this 上使用 static_cast。因为这有点难看,所以我把它放在一个函数后面:

    void foo(Object o) { self()->bar(o); }
private:
__derived* self() {return static_cast<__derived*>(this);}
const __derived* self() const {return static_cast<__derived*>(this);}
};

完整代码:http://coliru.stacked-crooked.com/a/81595b0fcd36ab93

关于c++ - 奇怪的重复出现的模板和模板参数相关的子类化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24274941/

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