从模板基类派生的类的隐式转换

5

我在隐式转换、模板以及从模板类继承方面遇到了问题。以下是我从我的项目中提取的内容,我省略了一些类甚至是抽象的,但这与本例无关。

class A {};
class B : public A {};

template <typename T> class Base {};
class Derived : public Base<B> {};

int main() {
    Derived d;
    Base<A>* base = new Derived();
}

基本上,我有一个模板基类Base,从中派生出Derived : public Base<B>。然后我必须将其转换为最常见的Base形式,即Base<A>
我原以为可以将从Base<B>派生的对象隐式地转换为Base<A>,因为B派生自A。我做错了什么或者如何才能隐式地进行强制转换呢?这很重要,因为我需要在Base方法的参数中接受所有类型的Derived类。
提前感谢。
2个回答

6
这是不可能的。无论A和B之间有何关系,Base<A>Base<B>没有任何关系。

好的,谢谢。你会如何尝试修复它?你会考虑使用boost::any吗? - opatut
@opatut:考虑为你的方法使用一个模板。除此之外,没有更多的信息,这就是我能提供的建议。 - Puppy
模板似乎可以工作,尽管我无法使用static_assert(std::is_base_of(...))进行检查,但这也不太重要。 - opatut

2

Base<B>不一定需要与Base<A>有关系。这与Derived无关。如果您想强制建立这样的关系,您需要一个模板化的构造函数。

template <typename T>
class Base
{
    template <typename TOther>
    Base(const TOther& that)
    {
        // ...
    }
    // ...
};

显然,实现将取决于Base的实际实现。请注意,此构造函数不能替代正常的复制构造函数。

这样做不行,因为“Base”类将成为引擎的一部分,“Other”将成为实际应用程序的一部分。无论如何感谢您。 - opatut
不是要指导您如何构建代码,但是没有理由那个模板化的构造函数不能在您的头文件中,并仅调用一个隐藏函数来执行实际工作。 - John Calsbeek
“不是要告诉你如何架构你的代码”,但你最好这样做 - 我被所有那些模板弄糊涂了,所以我忘记它们是如何工作的。对不起 :D 我会将你的答案考虑为一个选项。 - opatut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接