首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板类的类型转换

模板类的类型转换
EN

Stack Overflow用户
提问于 2015-01-23 21:13:02
回答 3查看 199关注 0票数 0

如果我有一个名为Wood的类,一个名为Chopper的模板类,以及一个接受对Chooper的引用的方法,如下所示的…

代码语言:javascript
复制
KeepWarm::burnFuel( Chopper <Wood>& wood_chopper ); 

如何转换或转换Chooper,其中CedarWood派生自木头,以便KeepWarm::burnFuel接受它?

重述…

代码语言:javascript
复制
class Wood
{
};

class CedarWood: public Wood
{
};

template class T;
class Chopper
{
  Chopper( const T value ); 
};

class KeepWarm
{
  void burnFuel( Chopper<Wood>& wood_chopper );
};

Chopper<CedarWood> some_wood;

//

KeepWarm::burnFuel( some_wood ); // the troublesome line, is this kind of thing possible?
EN

回答 3

Stack Overflow用户

发布于 2015-01-23 21:20:39

不,这是不可能的,因为Chopper<Wood>实际上与Chopper<CedarWood>没有关系。

您可以通过将burnfuel函数设置为模板函数来解决此问题:

代码语言:javascript
复制
template<typename T>
void burnfuel(Chopper<T>& chopper);
票数 2
EN

Stack Overflow用户

发布于 2015-01-23 21:20:14

您可以将burnFuel转换为模板:

代码语言:javascript
复制
class KeepWarm
{
  template<typename W>
  void burnFuel( Chopper<W>& wood_chopper );
};
票数 0
EN

Stack Overflow用户

发布于 2015-01-23 21:32:22

也许您可以通过在std::is_base_of中使用模板方法来实现您所期望的功能

代码语言:javascript
复制
// code based on molbdnilo's example
template <typename W>
void burnFuel(Chopper<W>& wood_chopper) {
    if (std::is_base_of<Wood, W>::value) {
        // ok
    }
}

或者:

代码语言:javascript
复制
template <typename T>
class KeepWarm
{
    template <typename W>
    void burnFuel(Chopper<W>& wood_chopper) {
        if (std::is_base_of<T, W>::value) {
            // ok
        }
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28110719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档