我通过在C ++上使用模板技术学习了这个代码,就像继承一样。这段代码有效。
#include <iostream>
using namespace std;
template < typename T >
class Base {
public:
explicit Base(const T& policy = T()) : m_policy(policy) {}
void doSomething()
{
m_policy.doA();
m_policy.doB();
}
private:
T m_policy;
};
class Implemented {
public:
void doA() { cout << "A"; };
void doB() { cout << "B"; };
};
int main() {
Base<Implemented> x;
x.doSomething();
return 0;
}
但是,是否可以在doA和doB中添加具有新typename S的参数?例如,此代码不会因类型/值不匹配错误而起作用。
#include <iostream>
using namespace std;
template < typename T, typename S >
class Base {
public:
explicit Base(const T& policy = T()) : m_policy(policy) {}
void doSomething()
{
m_policy.doA(m_s);
m_policy.doB(m_s);
}
private:
T m_policy;
S m_s;
};
template < typename S >
class Implemented {
public:
void doA(S& s) { cout << "A" << s; };
void doB(S& s) { cout << "B" << s; };
};
int main() {
Base<Implemented, int> x;
x.doSomething();
return 0;
}
我想我必须让class Base和Implemented都知道main()的实际S类型。我该如何解决这个问题?感谢您的帮助。
答案 0 :(得分:2)
在这一行:
Base<Implemented, int> x;
Implemented
不再是类型,现在您将其设为模板。但是Base
仍然需要一个类型 - 所以给它一个:
Base<Implemented<int>, int> x;
答案 1 :(得分:0)
当Implemented是一个类时,您使用了模板参数T
。现在Implemented是一个模板类,你需要使用一个所谓的模板模板参数,如下所示:
#include <iostream>
using namespace std;
template < template <class TS> class T, typename S >
class Base {
public:
explicit Base(const T<S>& policy = T<S>()) : m_policy(policy) {}
void doSomething()
{
m_policy.doA(m_s);
m_policy.doB(m_s);
}
private:
T<S> m_policy;
S m_s;
};
template < typename S >
class Implemented {
public:
void doA(S& s) { cout << "A" << s; };
void doB(S& s) { cout << "B" << s; };
};
int main() {
Base<Implemented, int> x;
x.doSomething();
return 0;
}