我有一个带有函数的父类。在这个函数中,我想调用一个模板方法,但模板的类型取决于子类的类型。所以我想在那里保存有关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;
}
}
答案 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;
}
花一些时间来审查模板和继承的工作方式可能会很好。