铸造模板类

时间:2015-01-23 13:13:02

标签: c++ templates casting

如果我有一个名为Wood的类,并且调用了一个模板类     Chopper,以及接受引用的方法     像这样的Chooper ......

KeepWarm::burnFuel( Chopper <Wood>& wood_chopper ); 

我怎样才能投射或转换Chooper,其中CedarWood来自Wood,以便KeepWarm :: burnFuel会接受它?

回顾......

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?

3 个答案:

答案 0 :(得分:2)

不可能,因为Chopper<Wood>实际上与Chopper<CedarWood>无关。

您可以通过使burnfuel函数成为模板函数来解决此问题:

template<typename T>
void burnfuel(Chopper<T>& chopper);

答案 1 :(得分:0)

您可以将burnFuel转换为模板:

class KeepWarm
{
  template<typename W>
  void burnFuel( Chopper<W>& wood_chopper );
};

答案 2 :(得分:0)

也许你可以通过std::is_base_of使用模板方法做出类似的事情:

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

或:

template <typename T>
class KeepWarm
{
    template <typename W>
    void burnFuel(Chopper<W>& wood_chopper) {
        if (std::is_base_of<T, W>::value) {
            // ok
        }
    }
};