在子类中保存模板信息

时间:2018-01-30 19:29:57

标签: c++ templates inheritance

我有一个带有函数的父类。在这个函数中,我想调用一个模板方法,但模板的类型取决于子类的类型。所以我想在那里保存有关T的信息。我无法使用模板调用foo,因为它来自本程序的其他部分,我无法更改

body{
 font-family: Avenir, Heveltica, sans-serif;
}  
ul {
  display: grid;
  grid-template-columns: repeat(5, 10vw);
  grid-template-rows: repeat(5, 10vw);
  justify-content: center;
  align-content: center;
  grid-gap: 1rem;
  min-height: 90vh;
  list-style: none;
  margin: 0 0 2vw;
  padding: 0;
  font-size: calc(2vw + 1px);
}
li {
  margin: 0;
  padding: 0;
  text-align: center;
  border: 4px solid black;
  display: flex;
  align-items: center;
  justify-content: center;
  span {
    margin-top: 0.4rem;
  }  
}

2 个答案:

答案 0 :(得分:1)

您需要的是CRTP模式,这在C ++模板编程中非常常见。

template<class T>
void ba() {}

template<class Derived>
struct A
{
    void foo() {
        ba<typename Derived::MyT>();
    }
};

struct B
    : public A<B>
{
    using MyT = int;
};

struct C
    : public A<C>
{
    using MyT = double;
};


int main() {
    B b;
    b.foo();
    C c;
    c.foo();  
}

答案 1 :(得分:0)

您需要将模板参数添加到基类A,然后在B和C的声明中指定类型。请参阅下面的示例:

template <typename T>
class A
{
    public:
    void foo()
    {
        ba<T>();
    }
};


class B : public A<int>
{
};

class C : public A<bool>
{
};

int main()
{
    B b;
    C c;

    b.foo(); // This calls ba<int>()
    c.foo(); // This calls ba<bool>()

    return 0;
}

花一些时间来审查模板和继承的工作方式可能会很好。

Inheritance

Templates