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

2024-02-06

我正在尝试使以下代码工作

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;

问题是,编译器声称无法找到该符号Object在 - 的里面Derived类,同时推导第二个模板参数Base班级。注释版本也会产生相同的错误。

我试图在 Eigen3 代码的启发下做到这一点,特别是他们使用的 CRTP(奇怪的重复模板模式)以避免使用虚拟函数。 Eigen3实际上使用了traits类,但我不知道如何在当前的情况下模仿它。 有人对此有什么建议吗?提前致谢!


通常,如果您希望 A 继承 B,那么 B 除了 A 的声明之外无法知道有关 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.
};

The 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;

Unrelated, leading double underscores are disallowed for use by mortals, use a single leading underscore followed by a lowercase letter. Alternatively, use a trailing underscore.

另外,语法

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

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

    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 http://coliru.stacked-crooked.com/a/81595b0fcd36ab93

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

奇怪的重复出现的模板和模板参数相关的子类化问题 的相关文章

随机推荐